MongoDB 笔记之 聚合

返回集合中的文档数量

db.user.count()

同样,还可以为 count 添加查询条件

如:

db.user.count({"name":"jack"});

返回指定键所有不同的值

db.runCommand({"distinct": "user","key":"name"})

user 是集合, name 是键,功能同 关系型数据库的 distinct 一样,不多说

group分组                       

先举个例子吧,

所有的数据:

{ "_id" : ObjectId("50c021d93a76cbcc77ae7411"), "name" : "tom", "sex" : "Male", "score" : "60" }
{ "_id" : ObjectId("50c0222b3a76cbcc77ae7412"), "name" : "jack", "sex" : "Male", "score" : "100" }
{ "_id" : ObjectId("50c022603a76cbcc77ae7413"), "name" : "lucy", "sex" : "Female", "score" : "90" }
{ "_id" : ObjectId("50c022843a76cbcc77ae7414"), "name" : "mark", "sex" : "Male", "score" : "84" }
{ "_id" : ObjectId("50c022a23a76cbcc77ae7415"), "name" : "mari", "sex" : "Female", "score" : "76" }

假设:根据性别分组,并且找出男女中分数最高的人,并且排除 "jack" ,因为老师认定他考试作弊,被开除了。

第一种做法:

db.user.group(
..  {key:{sex:true},
..  initial:{score:0},
..  $reduce:function(doc,prev){
..  if(Number(doc.score)>Number(prev.score)){
..  prev.score = doc.score;
..  prev.name = doc.name
..  }},
..  condition:{name:{$ne:"John"}}
.. })

第二种做法:

 db.runCommand({group:
.. {ns:"user",
.. key:{sex:true},
.. initial:{score:0},
.. $reduce:function(doc,prev){
.. if(Number(doc.score)>Number(prev.score)){
.. prev.score = doc.score
.. prev.name = doc.name
.. }},
.. condition:{name:{$ne:"John"}}
.. }});

ns:就是集合名称,nameSpace       

key:分组的字段      

initial:每个分组都会有一个 initial 初始文档,他作为传递每个分组最后的值,每一组的所有成员都会使用这个累加器,所以改变会保留。

$reduce:每个文档都会调用一次这个函数,该函数传递两个参数,第一个参数为当前文档对象,第二个为累加器对象,也就是上面说的那个,我们这里是每次比较分数的值,哪个分数高,就把哪个放到累加器中,可以说,累加器对象里面有什么数据,最后的结果就是什么数据,再加上分组的数据。 在比较的时候我们使用了Number() js 函数,是为了让他做数学大小的比较

condition:就是分组之前的筛选条件了。

group 使用完成器,

顾名思义,就是group 分组完成后调用的,相当于 关系型数据库的 having ,使用时只需将 finalize 键放进去,根据需求做处理就可以了






原文地址:https://www.cnblogs.com/moonciki/p/8145868.html