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/增删改查/聚合/索引/连接/备份与恢复/监控等)