mongodb聚合

聚合aggregate

统计功能,用来计算数据

db.集合名称.aggregate([{管道:{表达式}}])

管道(|):把上一次的结果输出,作为下次结果的输入

聚合框架中常用的几个操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。
$Group
  • counter : 结果字段
  • {$sum:1} : 每一行+1
  • $sum : 前面加%$, 表示属性
  • 1表示统计个数
  • _id:null : 将整个集合分成一组
db.stu.aggregate(
    {$group:{_id:'$age',counter:{$sum:1}}}
)

# 按照年龄求和
db.stu.aggregate(
    {$group:{_id:'$age',counter:{$sum:'$age'}}}
)

# avg:平均值  min/max/first/last/push ...

push: 把基于counter分组结果加到数组中去

输出:
{
    "_id" : 13.0,
    "counter" : [ 
        13.0, 
        13.0, 
        13.0
    ]
}

获取整个文档:$$ROOT

db.stu.aggregate(
    {$group:{_id:'$age',counter:{$push:'$$ROOT'}}}
)

输出:

{
    "_id" : 23.0,
    "counter" : [ 
        {
            "_id" : ObjectId("59cd646e68b8b37683687a6d"),
            "name" : "dimples",
            "age" : 23.0
        }
    ]
}
$match
  • 用于过滤数据,只输出符合条件的文档
  • 使用MongoDB的标准查询操作

查询年龄>20的学生

db.stu.aggregate(
    {$match:{age: {$gt:20}}}
)

查询年龄>10的人数

db.stu.aggregate(
    {$match:{age: {$gt:10}}},
    {$group:{
        _id:'$age',
        counter:{$sum:1}
        }}
)
$project 投影
  • 修改输入文档的结构(显示那些字段..)

基于: 查询年龄>10的人数,显示counter

db.stu.aggregate(
    {$match:{age: {$gt:10}}},
    {$group:{
        _id:'$age',
        counter:{$sum:1}
        }},
    {$project:{_id:0,counter:1}}
)
$sort
  • 基于$group之后写

排序

db.stu.aggregate(
    {$match:{age: {$gt:10}}},
    {$group:{
        _id:'$age',
        counter:{$sum:1}
        }},
    {$project:{_id:1,counter:1}},
    {$sort:{_id:1}}
)
$unwind拆分数组
  • 把文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
  • 从输入文档中解构一个数组字段,以输出每个元素的文档。每个输出文档都是由元素替换的数组字段的值的输入文档。
对某字段值进行拆分
db.集合名称.aggregate([{$unwind:'$字段名称'}])

构造数据:

db.p2.insert({_id:1,title:'t-shirt',size:['M','L','S']})

查询:

db.p2.aggregate([
    {$unwind:'$size'}
])
处理空数组、无字段、null情况
  • includeArrayIndex : 用于保存元素的数组索引的新字段的名称。该名称不能以美元符号开始$。
  • preserveNullAndEmptyArrays(boolean)
    • 如果true,如果path为空,缺少或空数组,则 $unwind输出文档。不会丢失。
    • 如果false,如果$unwind文件path为空,丢失或空数组, 则不输出文档。会丢失。
db.p2.aggregate([
    {$unwind:{
        path:'$size',
        preserveNullAndEmptyArrays:true
    }}
])
db.stu.aggregate([
    {$group:{_id:'$age',counter:{$sum:1},docs:{$push:'$$ROOT'}}},
    {$project:{_id:0,counter:1,docs:1}},
    {$unwind:'$docs'}
])



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值