博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongodb中的aggregate(聚合查询)
阅读量:7044 次
发布时间:2019-06-28

本文共 2100 字,大约阅读时间需要 7 分钟。

什么是aggregate

aggregate类似于pipe.拆分结果然后对结果进行分析求值然后再返回新结果..

文档

案例

那么aggregate有什么作用呢?举个例子 testName文档中有如下几个集合

<!-- more -->

//集合一{    _id:1,    list:[        {name:"x",age:11,sex:"boy"},        {name:"y",age:12,sex:"girl"},        {name:"z",age:13,sex:"boy"},        {name:"n",age:14,sex:"boy"},    ]}//集合二{    _id:2,    list:[        {name:"q",age:15,sex:"boy"},        {name:"w",age:16,sex:"girl"},        {name:"e",age:17,sex:"girl"},        {name:"r",age:18,sex:"boy"},    ]}//集合三{     _id:3,    list:[        {name:"a",age:19,sex:"girl"},        {name:"s",age:20,sex:"girl"},        {name:"d",age:21,sex:"girl"},        {name:"f",age:22,sex:"boy"},    ]}

我们想筛选出list中sex为boy的集合.理所当然我们会这样写

db.testName.find({"list":{"$elemMatch":{"sex":"boy"}}})

当然这样写是能拿到结果的.拿到的是什么结果呢?结果会返回所有的sex=boy的集合,并且sex=girl的数据也包含在内.但是我们只想要sex=boy的数据.这时候就可以用聚合查询了

聚合查询

db.testName.aggregate(    {"$unwind":"$list"},    {"$match":{"list.sex":{"$eq":"boy"}}},         {        "$group":{            "_id":"$_id",            "results":{                "$push"{"name":"$list.name","age":"$list.age","sex":"$list.sex"}            }        }    }   )

okay,不要怕.我们慢慢来分析 首先从$unwind来分析.$unwind会拆分数组元素拆分成一个一个集合那么这条参数执行后会得到什么结果呢?

{    _id:1,    list:{name:"x",age:11,sex:"boy"},}{    _id:1,    list:{name:"y",age:12,sex:"girl"},}{    _id:1,    list:{name:"z",age:13,sex:"boy"},}...

会拆分成一条条的临时集合,这个临时集合的名称就是$list,这就相当于第一道工艺程序把数组拆分开.接下来交给第二道程序{"$match":{"list.sex":{"$eq":"boy"}}} 这条语句作用是啥呢?想必大家也知道了.就是对临时的集合进行一个查询,类似于db.$list.find(),那么查询到的肯定就是sex=boy的数据了 现在返回的数据就是 不会有sex=girl的存在了

{    _id:1,    list:{name:"x",age:11,sex:"boy"},}{    _id:1,    list:{name:"z",age:13,sex:"boy"},}....

接下来就是要把这些组合在一起,也就是第三道工艺程序

{    "$group":{        "_id":"$_id",        "results":{            "$push"{"name":"$list.name","age":"$list.age","sex":"$list.sex"}        }    }}

其实也很好理解,$group就是组合的意思,把这些零散的数据以我们想要的形式组合起来.这个$_id指的就是临时集合中的_id.那么$list就是临时集合中的list,以_id为首把这些零散的list给组合成一个新的数组就是聚合.$push是添加一个对象,当然也有更简单的方式

{    "$group":{        "_id":"$_id",        "results":{            "$push":"$list"        }    }}

这样就直接把整个list对象给push到一个数组中.那么这样查询最终返回的结果就是我们想要的结果了

转载地址:http://vlhal.baihongyu.com/

你可能感兴趣的文章
学习Hadoop大数据基础框架
查看>>
Ansible-playbook roles安装mysql实例(学习笔记二十七)
查看>>
HT for Web列表和3D拓扑组件的拖拽应用
查看>>
javascript replaceAll方法
查看>>
Hacker News 12 月招聘趋势:React 已霸榜 19 个月
查看>>
SpringBoot配置devtools实现热部署
查看>>
实验吧 ---- 隐写术之so beautiful so white
查看>>
sklearn调包侠之线性回归
查看>>
《Linux命令行与shell脚本编程大全》 第四章
查看>>
Flask开发微电影网站(四)
查看>>
使用Maven搭建Springboot版ssm框架
查看>>
中介者模式
查看>>
怎么就死循环了!
查看>>
Jmeter之tomcat性能测试+性能改进措施
查看>>
MP实战系列(七)之集成springboot
查看>>
hexo 创建文章、标签、分类的Front-matter
查看>>
Confluence 6 复杂授权或性能问题
查看>>
从中国质造到淘宝心选:CBM赋能“数造”新品牌
查看>>
Python 学习笔记1
查看>>
python(logging )日志模块学习
查看>>