MongoDB笔记 聚合(详细)
Posted Aurora1217
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB笔记 聚合(详细)相关的知识,希望对你有一定的参考价值。
三种聚合的方法
聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。
以下例子所使用的集合里面的文档
> db.sale_detail.insert([
... {goodsid:"1001",amount:2,price:10.2,ok:false},
... {goodsid:"1001",amount:3,price:14.8,ok:false},
... {goodsid:"1002",amount:10,price:50,ok:false},
... {goodsid:"1002",amount:2,price:10,ok:true}])
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 4,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
> db.sale_detail.find().pretty()
{
"_id" : ObjectId("6094fcaf591ccad73c1e27ca"),
"goodsid" : "1001",
"amount" : 2,
"price" : 10.2,
"ok" : false
}
{
"_id" : ObjectId("6094fcaf591ccad73c1e27cb"),
"goodsid" : "1001",
"amount" : 3,
"price" : 14.8,
"ok" : false
}
{
"_id" : ObjectId("6094fcaf591ccad73c1e27cc"),
"goodsid" : "1002",
"amount" : 10,
"price" : 50,
"ok" : false
}
{
"_id" : ObjectId("6094fcaf591ccad73c1e27cd"),
"goodsid" : "1002",
"amount" : 2,
"price" : 10,
"ok" : true
}
1.管道聚合方法
语法:
db.collection_name.aggregate([
{$match:{<query>}},
{$group:{<field1>:<field2>}}
])
命令说明:
field1:分类字段
field2:含各种统计操作符的数值型字段
统计操作符:$sum、$avg、$min、$max
$push、$addToSet、$first、$last
aggregate命令作用类似SQL语言里的groupby语句的使用方法
实例:
(1)$sum
> db.sale_detail.aggregate([
... {$match:{ok:false}},
... {$group:{_id:"$goodsid",total:{$sum:"$amount"}}}
... ])
{ "_id" : "1002", "total" : 10 }
{ "_id" : "1001", "total" : 5 }
(2)$avg
> db.sale_detail.aggregate([
... {$match:{$or:[{ok:false},{goodsid:"1002"}]}},
... {$group:{_id:"$goodsid",avarage:{$avg:"$amount"}}}
... ])
{ "_id" : "1002", "avarage" : 6 }
{ "_id" : "1001", "avarage" : 2.5 }
(3)$min
> db.sale_detail.aggregate([
... {$match:{ok:false}},
... {$group:{_id:"$goodsid",min:{$min:"$amount"}}}
... ])
{ "_id" : "1002", "min" : 10 }
{ "_id" : "1001", "min" : 2 }
(4)$max
> db.sale_detail.aggregate([
... {$match:{ok:false}},
... {$group:{_id:"$goodsid",max:{$max:"$amount"}}}
... ])
{ "_id" : "1002", "max" : 10 }
{ "_id" : "1001", "max" : 3 }
(5)$push
> db.sale_detail.aggregate([
... {$match:{price:{$lt:20}}}
... ,{$group:{_id:"$goodsid",push:{$push:"$price"}}}
... ])
{ "_id" : "1002", "push" : [ 10 ] }
{ "_id" : "1001", "push" : [ 10.2, 14.8 ] }
(6)$addToSet
> db.sale_detail.aggregate([
... {$match:{price:{$lt:20}}}
... ,{$group:{_id:"$goodsid",addtoset:{$addToSet:"$price"}}}
... ])
{ "_id" : "1002", "addtoset" : [ 10 ] }
{ "_id" : "1001", "addtoset" : [ 14.8, 10.2 ] }
(7)$first
> db.sale_detail.aggregate([
... {$match:{price:{$gte:10.2}}},
... {$group:{_id:"$goodsid",first:{$first:"$price"}}}
... ])
{ "_id" : "1002", "first" : 50 }
{ "_id" : "1001", "first" : 10.2 }
(8)$last
> db.sale_detail.aggregate([
... {$match:{price:{$gte:10.2}}},
... {$group:{_id:"$goodsid",last:{$last:"$price"}}}
... ])
{ "_id" : "1002", "last" : 50 }
{ "_id" : "1001", "last" : 14.8 }
2.map-reduce方法
语法:
db.collection_name.mapReduce(
function(){emit(<this.field1>,<this.field2>)},
function(key,values){return array.sum(values)},
{query:{<field>},out:<resultname>}
)
命令说明:
function(){emit(<this.field1>,<this.field2>)} 把集合对应字段<field1><field2>进行map(映射)操作,并作为reduce函数输入参数
function(key,values){return array.sum(values)} 进行reduce(规约)操作,求得sum值,把values数组转换成一个单一的值value
query:设置筛选条件,满足条件才调用map方法
out:统计结果的存放集合,如果不指定则使用临时集合,但在客户端断开之后自动删除
实例:
> var arr = db.sale_detail.mapReduce(
... function(){emit(this.goodsid,this.price)},
... function(key,values){return Array.sum(values)},
... {query:{ok:false},out:{replace:"result"}}
... )
> db[arr.result].find()
{ "_id" : "1001", "value" : 25 }
{ "_id" : "1002", "value" : 50 }
> show collections
books
goodsbaseinf
order
result
sale_detail
3.单一目标聚合方法
语法:
db.collection_name.count(<query>,<options>)
db.collection_name.distinct("key")
命令说明:
query:查询条件
options:参数
-limit 限制要计数的文档的最大数量
-skip 计数前要跳过的文档数
单一目标聚合方法,可以直接在find后加点使用
实例:
(1)count
> db.sale_detail.count({price:{$gte:10.2}})
3
> db.sale_detail.count({price:{$gte:10.2}},{skip:1})
2
> db.sale_detail.count({price:{$gte:10.2}},{limit:1})
1
> db.sale_detail.count({price:{$gte:10.2}},{limit:2})
2
(2)distinct
> db.sale_detail.distinct("price")
[ 10.2, 14.8, 50, 10 ]
> db.sale_detail.distinct("amount")
[ 2, 3, 10 ]
(3)find
> db.sale_detail.find({price:{$gt:10}}).count()
3
> db.sale_detail.find({price:{$gt:10.2}}).count()
2
以上是关于MongoDB笔记 聚合(详细)的主要内容,如果未能解决你的问题,请参考以下文章
[第16期] mongoDB 干货笔记(mongoose/增删改查/聚合/索引/连接/备份与恢复/监控等)