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 键放进去,根据需求做处理就可以了