聚合操作
对返回的文档中的数据进行统计分析。
聚合管道
db.users.aggregate([
{$group:{_id:"$name",uage:{$sum:"$age"}}}
])//在age字段聚合
{ "_id" : "lucy", "uage" : 10 }
{ "_id" : "tom", "uage" : 35 }
{ "_id" : [ "a", "b", "c" ], "uage" : 23 }
{ "_id" : "jack", "uage" : 47 }
{ "_id" : [ "b", "c" ], "uage" : 0 }
//$group表示分组,_id表示分组字段的值,uage表示聚合后的key : value为对哪个字段的值进行聚合
//$match表示匹配管道,$group分组管道,$projec投影管道,$skip,$limit,$sort
//$sum,$avg,$min,$max,$first,$last
//{$sum:1}统计所有文档数
示例
>db.users.aggregate([
{
$match: { $or: [ { age: { $gt: 70, $lt: 90 } }, { v: { $gte: 1000 } } ] } },
{ $group: { _id: "$name", newKey: { $sum: 1 } }
}
]);//统计每组的文档数 以name的值分组
> db.products.aggregate([{$match:{quantity:{$lt:10}}},{$sort:{quantity:1}},{$skip:1},{$limit:3}])
//匹配、排序、分页
聚合实现排序,跳过1项,返回3项(即分页),如下:
//所有数据
{ "_id" : ObjectId("617929cecab76e646e11e7b4"), "quantity" : 2, "price" : 4, "pnumber" : "p001" }
{ "_id" : ObjectId("6179295dcab76e646e11e7b0"), "quantity" : 2, "price" : 5, "pnumber" : "p003" }
{ "_id" : ObjectId("61792970cab76e646e11e7b2"), "quantity" : 2, "price" : 8, "pnumber" : "p002" }
{ "_id" : ObjectId("617929dfcab76e646e11e7b5"), "quantity" : 4, "price" : 10, "pnumber" : "p003" }
{ "_id" : ObjectId("61792a0ccab76e646e11e7b8"), "quantity" : 5, "price" : 10, "pnumber" : "p002" }
{ "_id" : ObjectId("617929f8cab76e646e11e7b6"), "quantity" : 10, "price" : 20, "pnumber" : "p001" }
{ "_id" : ObjectId("617929fbcab76e646e11e7b7"), "quantity" : 10, "price" : 20, "pnumber" : "p003" }
> db.products.aggregate([{$sort:{price:1}},{$skip:1},{$limit:3}])//price 排序,跳过1项,取3项
{ "_id" : ObjectId("617929cecab76e646e11e7b4"), "quantity" : 2, "price" : 4, "pnumber" : "p001" }
{ "_id" : ObjectId("6179295dcab76e646e11e7b0"), "quantity" : 2, "price" : 5, "pnumber" : "p003" }
{ "_id" : ObjectId("61792970cab76e646e11e7b2"), "quantity" : 2, "price" : 8, "pnumber": "p002" }
mapReduce操作
>db.users.find()
{ "_id" : ObjectId("611dc14a623a0dbae82982c5"), "name" : "jack", "age" : 29 }
{ "_id" : ObjectId("611dc14a623a0dbae82982c6"), "name" : "tom", "age" : 23 }
{ "_id" : ObjectId("611dd190d0bf16d55c366a29"), "name" : "jack", "age" : 18 }
{ "_id" : ObjectId("611dd1aad0bf16d55c366a2a"), "name" : "tom", "age" : 12 }
{ "_id" : ObjectId("611dd1aad0bf16d55c366a2b"), "name" : "lucy", "age" : 10 }
//使用map-reduce进行聚合年龄
>var mapFunc=function(){
... emit(this.name,this.age); //定义map函数,以name进行分组,name的值为key,以age的值作为新的value,得到结果如:“jack”:[29,18,]
... }
> var reduceFunc=function(key,values){
... return Array.sum(values);//定义reduce函数,对年龄数组求和
//Array.avg()
//Array.min()
//Array.tab键盘查看其他函数
... }
> db.users.mapReduce(mapFunc,reduceFunc,{out:{replace:"map-reduce-result"}})
{ "result" : "map-reduce-result", "ok" : 1 }