一、拆分数组

关键字:$unwind

collection.aggregate([{'$unwind':'$字段名'},
])

一次只能拆开一个数组,继续拆开需要继续$unwind

二、联集合查询

先插入数据,数据在文末。实现下列案例:

  1. 以微博用户为准,查询用户集合
  2. 把查询结果中中用户数组展开
  3. 把返回字段中的name和work字段变为普通字段
  4. 以用户集合为基准,查询微博集合

1、同时查询多个集合

关键字:$lookup

主集合.aggregate([{'$lookup':{'from':'被查集合名','localField':'主集合的字段','foreignField':'被查集合的字段','as':'保存查询结果的字段名'}}
])

在微博集合中,把每一条微博对应的用户ID拿出来,在用户集合中查询用户的姓名和职业。
那么,主集合就是微博集合,被查集合就是用户集合。
保存查询结果的字段会是一个数组,因为被查询的集合中可能有多条记录都满足条件,用数组才能把他们都保存下来。

db.getCollection('example_post').aggregate([{'$lookup':{'from':'example_user','localField':'user_id','foreignField':'id','as':'user_info',}},
])

2、美化输出结果

  • 使用$unwind展开数组
  • 提取出name和work两个字段
db.getCollection('example_post').aggregate([{'$lookup':{'from':'example_user','localField':'user_id','foreignField':'id','as':'user_info',}},{'$unwind':'$user_info'},{'$project':{'content':1,'post_time':1,'name':'$user_info.name','work':'$user_info.work',}},
])

3、反过来联结集合

现在判断用户发了哪些微博,就要对代码进行相应的修改:

db.getCollection('example_user').aggregate([{'$lookup':{'from':'example_post','localField':'id','foreignField':'user_id','as':'weibo_info',}},{'$unwind':"$weibo_info"},{'$project':{'name':1,'work':1,'content':'$weibo_info.content','post_time':'$weibo_info.post_time',}},
])

附:插入数据

import pymongodb = pymongo.MongoClient().chapter_7
post = db.example_post
user = db.example_userweibo = [{'user_id': 1002, 'content': '考试完了,好无聊啊啊', 'post_time': '2018-06-11 12:23:12'},{'user_id': 1003, 'content': '大家看我今天吃得什么[图片]', 'post_time': '2018-06-11 12:27:12'},{'user_id': 1006, 'content': 'XX外卖送货太慢了,差评', 'post_time': '2018-06-11 14:00:12'},{'user_id': 1002, 'content': '我们不知道还能在一起多久', 'post_time': '2018-06-12 00:23:12'},{'user_id': 1001, 'content': '好不容易放假,楼上装修太吵了', 'post_time': '2018-06-12 08:23:12'},{'user_id': 1004, 'content': '疯了疯了疯了,我把洗衣服当成盐了', 'post_time': '2018-06-12 17:23:12'},{'user_id': 1004, 'content': '此处不留爷,自有留爷处', 'post_time': '2018-06-12 21:23:12'},{'user_id': 1005, 'content': '这个厕所设计得太美了', 'post_time': '2018-06-13 09:23:12'},{'user_id': 1007, 'content': 'XX叔,一路走好', 'post_time': '2018-06-13 17:23:12'},{'user_id': 1005, 'content': 'XX显示器的色彩太好看了', 'post_time': '2018-06-14 10:23:12'},{'user_id': 1008, 'content': '我在X市参与城市规划', 'post_time': '2018-06-15 12:01:12'},{'user_id': 1009, 'content': '小九中介竭诚为你服务', 'post_time': '2018-06-15 15:23:12'},{'user_id': 1001, 'content': '青山不改绿水长流,同学们后会有期', 'post_time': '2018-06-15 23:23:12'},{'user_id': 1003, 'content': '今天收到了小费。谢谢大老板。', 'post_time': '2018-06-15 23:23:12'},]
post.insert_many(weibo)user_info = [{'age': 17,'id': 1001,'name': '王小一','register_date': '2018-06-09','work': '学生'},{'age': 18,'id': 1002,'name': '张小二','register_date': '2018-06-09','work': '学生'},{'age': 19,'id': 1003,'name': '李小三','register_date': '2018-06-10','work': '服务员'},{'age': 20,'id': 1004,'name': '郭小四','register_date': '2018-06-10','work': '厨师'},{'age': 21,'id': 1005,'name': '毛小五','register_date': '2018-06-10','work': '美工'},{'age': 22,'id': 1006,'name': '欧阳小六','register_date': '2018-06-10','work': '工程师'},{'age': 23,'id': 1007,'name': '夏侯小七','register_date': '2018-06-10','work': '医生'},{'age': 24,'id': 1008,'name': '慕容小八','register_date': '2018-06-10','work': '建筑设计师'},{'age': 25,'id': 1009,'name': '南宫小九','register_date': '2018-06-10','work': '中介'}]
user.insert_many(user_info)

MongoDB 拆联查询相关推荐

  1. MongoDB 进阶-关联查询

    [苏州需要工作的加我QQ,内推介绍费平分] MongoDB 进阶 1.数据库命令 a.命令的工作原理 drop命令,在shell中删除一个集合,执行db.refactor.drop().其实这个函数实 ...

  2. MongoDB自定义条件查询案例

    MongoDB自定义条件查询案例

  3. MongoDB数据库(5.mongodb的聚合操作以及mongodb的高级查询2)

    聚合aggregate 聚合(aggregate) 是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage) 组成的管道,可以对每个阶段的  管道进行分组.过滤等功能,然后经过一系列的处理, ...

  4. php mongodb 子查询,MongoDB数组子查询elemMatch

    MongoDB数组子查询elemMatch 在 MongoDB数组子查询elemMatch详解 语法 db_name.collection_name.find({field:{$elemMatch:{ ...

  5. mysql 内联和外联的区别_内联查询与外联查询

    概述 在开发时,我们一般只进行单表查询,但有时候也会涉及到多表查询.内联查询和外联查询都是为了联合多张表进行信息查询.这里只是简单的说明几种联合查询如何使用,具体详细说明可以参看参考链接 联合查询 假 ...

  6. MongoDB文档查询操作(三)

    关于MongoDB中的查询,我们已经连着介绍了两篇文章了,本文我们来介绍另外一个查询概念游标. 本文是MongoDB系列的第七篇文章,了解前面的文章有助于更好的理解本文: 1.Linux上安装Mong ...

  7. python数据库-mongoDB的高级查询操作(55)

    一.MongoDB索引 为什么使用索引? 假设有一本书,你想看第六章第六节讲的是什么,你会怎么做,一般人肯定去看目录,找到这一节对应的页数,然后翻到这一页.这就是目录索引,帮助读者快速找到想要的章节. ...

  8. mongodb 之 模糊查询

    mongodb的模糊查询需要熟练掌握 正则匹配($regex),和全文检索($text),或者直接使用正则表达式. 一.mongodb中正则($regex)的用法: 1.{field:{$regex: ...

  9. ElasticSearch 6.3版本(ES)查询人名关键字不拆词查询

    ElasticSearch 6.3版本(ES)查询关键字不拆词查询:类似mysql 的 like 语句. mysql的sql语法类似如下,采用大量like和locate语法,进行模糊查询,导致查询一个 ...

最新文章

  1. 一个母婴电子商务网站贝贝网的大数据平台及机器学习实践【转】
  2. 华为麒麟990发布!余承东:全球首款旗舰5G SoC,业界最强手机AI算力,友商还都是PPT...
  3. 内网使用ohmyzsh
  4. 常用的上网 发帖技巧
  5. trace分析优化器执行计划 || optimizer
  6. axure 如何设置选项联动_Axure下拉框级联操作
  7. 贯通Java Web开发三剑客
  8. linux可以打开浏览器嘛,Linux下怎样可以打开浏览器
  9. Linux系统自启动脚本
  10. 从零开始学计算机组装与维修技术,从新手到高手:电脑组装、维护与故障排除...
  11. 使用Ping命令解析主机名解析出来的是IPv6
  12. 我们为什么要学习3D建模?
  13. ios和linux共享的笔记软件,超好用!5款完全免费、支持全平台的笔记软件
  14. java中的传参是什么意思_Java中参数传递是传值还是传址?
  15. AVFoundation之语音合成器
  16. Excel如何将中文快速翻译?
  17. Go 限流器 limter
  18. 有关数据库的一级、二级、三级封锁协议
  19. 走进河北石家庄市以富裕闻名的城中村:槐底村
  20. GDKOI-PJ-2021 Day1总结

热门文章

  1. CTPN windows下实现
  2. DD-wrt无线参数详解
  3. Java高级工程师面试题整理
  4. 计算机提升反思的相关文档,反思教学论文,关于教学反思在提升高校计算机专业青年教师教学水平中的应用相关参考文献资料-免费论文范文...
  5. matlab求不等式的方法,求解变分不等式的matlab程序我需要
  6. 静态HTML网页设计作品——仿2018淘宝首页(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  7. Linux NFS服务
  8. hdu 多校赛 第二场
  9. 音视频开发三:FFmpeg安装与常用命令
  10. OSChina 周六乱弹 —— 目测我们程序员丁克的几率不大