什么是aggregate

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

文档

MongoDB聚合 官方API MongoDB aggregate 运用篇 个人总结 - fycayy 案例一 案例二 案例三

案例

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

//集合一 
{ 
   _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到一个数组中.那么这样查询最终返回的结果就是我们想要的结果了