Study - mongodb 之 聚合

本文深入解析MongoDB中的聚合管道功能,涵盖基本概念、常用管道操作符及其实例,如$match、$project、$group等,帮助读者掌握复杂查询和数据统计技巧。

aggregate

一般查询可以通过find()方法,但如果是比较复杂的查询或者数据统计的话,find可能就无能为力了,这时也许你需要的是aggregate

什么是聚合管道?

  • aggregation pipeline,直译为聚合管道,它可以对数据文档进行变换和组合
  • 聚合管道是基于数据流概念,数据进入管道经过一个或多个stage,每个stage对数据进行操作(筛选,投射,分组,排序,限制或跳过)后输出最终结果

官方示例

db.collection.aggregate()方法
  • 聚合管道查询使用的方法
  • 参数是数组,每个数组元素就是一个stage,stage中运用操作符对数据进行处理后再交由下一个stage,直到没有下个stage,就输出最终的结果,而数据的处理则是通过使用操作符
管道操作符

mongoDB中有许多操作符,在aggregate中每个stage可以使用的操作符叫做管道操作符

分类
  • 阶段操作符(Stage Operators)
    • 阶段操作符是使用于db.collection.aggregate()方法里面,数组参数中的第一层
  • 表达式操作符(Expression Operators)
    • 表达式操作符主要用于在管道中构建表达式时使用,使用类似于函数那样需要参数,主要用于$project操作符中,用于构建表达式
  • 累加器(Accumulators)
    • 当在group中使用时,累加器是针对每个分组使用的
    • 当在project中使用时,累加器则是针对每个字面量起作用

以下列举比较常用的管道操作符:

操作符含义
$project投射操作符,用于重构每一个文档的字段,可以提取字段,重命名字段,甚至可以对原有字段进行操作后新增字段
$match匹配操作符,用于对文档集合进行筛选
$group分组操作符,用于对文档集合进行分组
$unwind拆分操作符,用于将数组中的每一个值拆分为单独的文档
$sort排序操作符,用于根据一个或多个字段对文档进行排序
$limit限制操作符,用于限制返回文档的数量
$skip跳过操作符,用于跳过指定数量的文档
$lookup连接操作符,用于连接同一个数据库中另一个集合,并获取指定的文档,类似于populate
阶段操作符详解
  • $match 匹配操作符
    用于对文档集合进行筛选

    { $match: { <query> } }
    
    • 查询name为“111”的书
    • 查询书的owner为“eee”的书
  • $project 投射操作符
    用于重构每一个文档的字段,可以提取字段,重命名字段,甚至可以对原有字段进行操作后新增字段

    { $project: { <specification(s)> } }
    

    specification的规则:

    规则描述
    _id: 0 or false不返回_id(默认返回)
    <字段名>: 1 or true选择需要返回什么字段
    <字段名>: 表达式使用表达式,可以用于重命名字段,或对其值进行操作,或新增字段
    <字段名>: 0 or false选择需要不返回什么字段,注意:当使用这种用法时,就不要用上面的方法
    • book集合投射name

    • 将book集合的name重命名为bookname

    • 返回新字段bookowner,并使用表达式让它的值为owner的大写

  • $sort 排序操作符

    用于根据一个或多个字段对文档进行排序

    { $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
    
  • $limit 限制操作符

    用于限制返回文档的数量

    { $limit: <positive integer> }
    
    • 返回3本book
  • $skip 跳过操作符

    用于跳过指定数量的文档

    { $skip: <positive integer> }
    
    • 跳过2本book
  • $group 分组操作符

    用于对文档集合进行分组

    { $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }
    

    注:_id是必须的,用作分组的依据条件

    • 将people按sex分组

阶段操作符

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值