aggregate相似于pipe.拆分结果真后对结果进行分析求值而后再返回新结果..html
MongoDB聚合
官方API
MongoDB aggregate 运用篇 我的总结 - fycayy
案例一
案例二
案例三mongodb
那么aggregate有什么做用呢?举个例子 testName文档中有以下几个集合数组
<!-- more -->ui
//集合一 { _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的集合.理所固然咱们会这样写code
db.testName.find({"list":{"$elemMatch":{"sex":"boy"}}})
固然这样写是能拿到结果的.拿到的是什么结果呢?结果会返回全部的sex=boy的集合,而且sex=girl的数据也包含在内.可是咱们只想要sex=boy的数据.这时候就能够用聚合查询了htm
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的存在了ip
{ _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是添加一个对象,固然也有更简单的方式get
{ "$group":{ "_id":"$_id", "results":{ "$push":"$list" } } }
这样就直接把整个list对象给push到一个数组中.那么这样查询最终返回的结果就是咱们想要的结果了