MongoDB 聚合管道的使用及聚合表达式的介绍

聚合管道是由一个或者多个处理文档的阶段组成,每个阶段对输入的文档执行一个操作(例如:可以过滤文档、对文档分组、计算值等),执行操作后的结果会进入到下一个处理阶段;

现在,我们对聚合管道的语法进行了解一下:

        db.collection.aggregate(pipeline, options)

其中,

        collection:指的是集合或者视图

        pipeline:数组类型,是一组数据聚合操作。

                其基本语法:[ { <stage> }, ... ];由一组stage组成的数组。

        options: 可选,文档类型,其他的一些选项。

下面我们以一个简单的例子来介绍聚合管道的使用:

一、准备工作

初始化商品明细数据

db.goods.insertMany([
    { "_id": 1,  name: "盆子", size: "S", quantity: 10, price: 5 },
    { "_id": 2,  name: "盆子", size: "M", quantity: 8, price: 8 },
    { "_id": 3,  name: "盆子", size: "L", quantity: 5, price: 12 },
    { "_id": 4,  name: "杯子", size: "S", quantity: 20, price: 2 },
    { "_id": 5,  name: "杯子", size: "M", quantity: 10, price: 5 },
    { "_id": 6,  name: "杯子", size: "L", quantity: 10, price: 10 }
])

二、简单使用聚合管道

我们上面了解了聚合管道的语法,下面我们以实际的例子来看一下聚合管理的具体使用。

实例:统计10元以内的不同商品的数量

要完成对不同商品的数量统计,需分成两步:

        (1) 查询10元以内的商品

        (2) 对商品的数据按照名称进行分组,并对每个分组中的商品数量进行求和。

db.goods.aggregate([
    {
        $match: { "price": { $lt : 10 } }
    },
    {
        $group: { "_id": "$name", "total": { $sum: "$quantity" } }
    }
])

统计的结果如下: 

{ "_id" : "盆子", "total" : 18 }
{ "_id" : "杯子", "total" : 30 }

上面的例子我们使用到了$match、$group两个stage,其中:

        $match: 用于过滤数据,过滤掉不满足条件的文档。

        $group: 对满足条件的文档按照名称进行分组,并按照商品数量进行累加求和。

        其中$name, $quantity是聚合表达式

三、聚合表达式

聚合表达式包括文本、字段路径、系统变量、表达式对象、运算符表达式;聚合表达式可以被嵌套。

1、文本

语法:{ $literal: <value> }

value的值将原样返回,即使value是表达式,表达式也会原样返回,不会被执行。

例子:

{ $literal: { $set:{ "comment": "我是新来的" } } } 执行的结果是 { $set:{ "comment": "我是新来的" }

2、字段路径

语法:$ + 字段名称

例子:

使用"$user"指定字段user的路径

使用"$user.name"指定user.name字段的路径

$<field>等效于$$CURRENT.<field>

其中$$CURRENT是一个系统变量默认指向当前对象的根

3、系统变量

语法:$$ + 系统变量

系统变量列表:

        NOW:返回当前的日期时间

        CLUSTER_TIME:返回当前时间戳

        ROOT:指向文档的根

        CURRENT:指向字段路径的起始位置,默认是文档的根,但是可以修改

        REMOVE:允许通过条件排除字段

        DESCEND:$redace表达式允许的结果之一

        PRUNE:$redace表达式允许的结果之一

        KEEP:$redace表达式允许的结果之一

4、表达式对象

语法:{ <field1>: <expression1>, ... }

其中,

        field: 字段

        expression: 表达式

5、运算符表达式

语法:{ <operator>: [ <argument1>, <argument2> ... ] }

        或 { <operator>: <argument> }

其中,

operator:表达式运算符,此处的表达式运算符比较多,这里就不再介绍,具体可以参考:
MongoDB 数据库操作汇总https://blog.csdn.net/m1729339749/article/details/130086022中的聚合表达式运算符

argument:表达式运算符参数,与表达式运算符相关,不同的表达式运算符会对应不同的参数语法。

四、总结

聚合管道中包含了多个处理文档的阶段,每个阶段处理完文档之后会产生新的文档数据,新产生的文档数据会交给下一个阶段进行处理。

聚合表达式包括文本、字段路径、系统变量、表达式对象、运算符表达式;聚合表达式可以被嵌套。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值