什么是aggregate
aggregate类似于pipe.拆分效果然后对效果举行剖析求值然后再返回新效果..
文档
MongoDB聚合
官方API
MongoDB aggregate 应用篇 个人总结 – fycayy
案例一
案例二
案例三
案例
那末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到一个数组中.那末如许查询终究返回的效果就是我们想要的效果了