Mongodb的聚合和管道操作符

聚合框架

使用聚合框架可以对集合文档进行变换和组合等,是通过一个或者多个管道操作符对一连串的文档进行处理;例如db.DB_COLLECTION.aggregate({"$project":{"name":1}}, {"group": {"_id":"name", "count":{"$sum":1}}}),这里用了2个管道操作符;

  1. aggregate()会返回一个文档数组
  2. 第一个管道操作符返回的结果集作为第二个管道操作符的输入;
  3. 聚合结果集不能过大,限制在16MB内;

管道操作符

每个管道操作符都会接受一连串文档,前一个操作符转换后的文档传递给下一个操作符,最后一个操作符的结果集返回给客户端;另外,不同的管道操作符可以按照任何顺序组合在一起使用,而且可以重复使用多次;
下面介绍下各个管道操作符。

$match筛选操作符

用于对文档集合进行筛选,可以在筛选得到的文档子集上做聚合。例如{$match:{"age":20}}筛选age为20的文档。

  1. $match可以使用常规的查询操作符,例如$gt$in等,但是不能使用地理空间操作符
  2. $match应该放在管道的最前位置,一是可以快速将不需要的文档过滤掉;二是可以使用集合已有的索引;
$project投射操作符

管道中的投射操作十分强大,使用$project可以从子文档提取字段、可以重命名字段、可以对字段使用表达式操作等;

  1. $project用于提取字段时语法跟普通查询时的第二个参数类似;例如返回结果需要"author"不需要"_id":{"$project":{"author":1,"_id":0}}

  2. $project用于对字段重命名的语法{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …":{"new_name":"old_name”}},例如把"_id"重名为"_useId"为{"KaTeX parse error: Expected '}', got 'EOF' at end of input: …ct":{"_useId":"_id"}};注意事项:

    • 字段重命名后,不能使用原名字创建的索引了,使用尽量在修改字段名称前使用索引;
  3. 使用表达式将多个字面量和变量组合在一个值中使用

    • 数学表达式$add加法、$subtract减法、$multiply乘法、$divide除法、$mod求余,例如获取奖励+薪资的总和:
      db.DB_COLLECTION.aggregate(
      {
          "$project":{
              "totalPay":{"$add":["$salary", "$bonus"]}
          }
      }
      )
      
    • 日期表达式$year$month$hour等等,需要注意的是只能对日期类型的字段进行日期操作;
    • 另外还有字符存表达式(例如$substr截取子串、$concat连接、$toLower转小写等)和逻辑表达式(例如$cmd比较、$and与操作等等);
$group分组操作符

$group可以对多个字段进行进行分组,选定了需要分组的字段后就可以将选定的字段传递给"KaTeX parse error: Expected '}', got 'EOF' at end of input: …"和城市名"city",`{"group":{"_id":{“state”:“ s t a t e " , " c i t y " : " state", "city":" state","city":"city”}}}`;
另外,支持使用分组操作符对每个分组中的文档做一些计算:

  1. 算术操作符,$sum求和、$avg平均数,例如求每个国家的总收入和平均收入
    db.DB_COLLECTION.aggregate(
    {
        "$group":{
            "_id":"$country",
            "totalRevenue":{"$sum":"$revenue"},
            "avgRevenue":{"$avg":"$revenue"}
        }
    }
    )
    
  2. 极限操作符,$max分组最大值、$min分组最小值、$first分组第一个值、$last分组最后一个值;
  3. 分组操作符不能使用流式工作方式对文档进行处理,即$group必须要等收到所有文档后才能进行操作;
$unwind拆分操作符

$unwind可以将数组中每一个值拆分为单独的文档,例如将博客的每条评论拆分为一个独立的文档db.DB_COLLECTION.aggregate({"$unwind": "$comments"});

其他管道操作符
  1. $sort排序操作符;
  2. $limit返回结果集中前n个文档的操作符;
  3. $skip跳过结果集中前n个文档的操作符,跟普通查询一样,skip如果跳过大量数据效率非常低;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值