我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MongoDB 聚合管道使用

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MongoDB 聚合管道使用

MongoDB 聚合管道使用

db.accounts.insert([{"name": {"first_name": "qingquan","last_name": "zeng"},"balance": 100},{"name": {"first_name": "fengxia","last_name": "yu"},"balance": 200}])

数据查询

$project

# aggregate 中的 $project 除了可以实现投影效果,还直接使用了一个不存在的字段 client_name ,相当于 mysql 中的 as 语法
> db.accounts.aggregate([{
... $project:{
... _id:0,
... balance:1,
... client_name:"$name.first_name"
... }
... }]);
{ "balance" : 100, "client_name" : "qingquan" }
{ "balance" : 200, "client_name" : "fengxia" }
# 由于 middle_name 不存在,产生的结果就为 null 了
> db.accounts.aggregate([{
... $project:{
... _id:0,
... balance:1,
... name_arr:["$name.first_name","$name.middle_name","$name.first_name"]
... }
... }]);
{ "balance" : 100, "name_arr" : [ "qingquan", null, "qingquan" ] }
{ "balance" : 200, "name_arr" : [ "fengxia", null, "fengxia" ] }

$match 中使用的文档筛选语法,和读取文档时的筛选语法相同

db.accounts.aggregate([
    {
        $match: {
            "name.first_name": "fengxia"
        }
    }
])
{ "_id" : ObjectId("5d80fd4471c6b2236fb80de9"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200 }

$project$match$skip$limit 相结合

db.accounts.aggregate([
    {
        $match: {
            $or: [
                {
                    "name.first_name": "fengxia"
                },
                {
                    "name.first_name": "qingquan"
                },          
            ]
        }
    },
    {
        $project: {
            _id: 0
        }
    },
    {
        $skip: 1
    },
    {
        $limit: 1
    }
])
{ "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200 }

$unwind 对本节的数据进行修改

db.accounts.update({"name.first_name":"qingquan"},{
 $set:{
  "currency":["CNY","USD"]
 }
})

db.accounts.update({"name.first_name":"fengxia"},{
 $set:{
  "currency":"GBP"
 }
})

修改后的数据如下,一个用户的currency是数组,另一个用户的currency是字符串

> db.accounts.find()
{ "_id" : ObjectId("5d80fd4471c6b2236fb80de8"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : [ "CNY", "USD" ] }
{ "_id" : ObjectId("5d80fd4471c6b2236fb80de9"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200, "currency" : "GBP" }

使用unwind对数组元素进行平铺,可以将currency为数组的记录,从一条记录拆分为多条记录

db.accounts.aggregate([
    {
        $unwind: {
            path: "$currency"
        }
    }
])
{ "_id" : ObjectId("5d80fd4471c6b2236fb80de8"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : "CNY" }
{ "_id" : ObjectId("5d80fd4471c6b2236fb80de8"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : "USD" }
{ "_id" : ObjectId("5d80fd4471c6b2236fb80de9"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200, "currency" : "GBP" }

为了方便排查,还可以在设定一个字段,用于数组展开后标记每个元素在原数组的位置

db.accounts.aggregate([
    {
        $unwind: {
            path: "$currency",
            includeArrayIndex:"origin_index"
        }
    }
])
{ "_id" : ObjectId("5d80c37349f3060f1212a055"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : "CNY", "origin_index" : NumberLong(0) }
{ "_id" : ObjectId("5d80c37349f3060f1212a055"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : "USD", "origin_index" : NumberLong(1) }
{ "_id" : ObjectId("5d80c37349f3060f1212a056"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200, "currency" : "GBP", "origin_index" : null }

还有一点需要注意的是,$unwind 在产生结果前,默认会直接过滤掉如下记录:

  • currency字段为空数组
  • currency字段不存在
  • currency字段为null

如果不想过滤的话,可以设定 preserveNullAndEmptyArrays 为 true

db.accounts.aggregate([
    {
        $unwind: {
            path: "$currency",
            includeArrayIndex: "origin_index",
            preserveNullAndEmptyArrays: true
        }
    }
])

$sort

  • 1 从小到大
  • -1 从大到小
db.accounts.aggregate([
    {
        $sort: {
            balance: -1
        }
    }
])
{ "_id" : ObjectId("5d80c37349f3060f1212a056"), "name" : { "first_name" : "fengxia", "last_name" : "yu" }, "balance" : 200, "currency" : "GBP" }
{ "_id" : ObjectId("5d80c37349f3060f1212a055"), "name" : { "first_name" : "qingquan", "last_name" : "zeng" }, "balance" : 100, "currency" : [ "CNY", "USD" ] }

MongoDB 聚合操作重复问题https://jacoobwang.github.io/2018/01/08/MongoDb%E8%81%9A%E5%90%88%E6%93%8D%E4%BD%9C%E9%87%8D%E5%A4%8D%E9%97%AE%E9%A2%98/

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MongoDB 聚合管道使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MongoDB 聚合管道使用

db.accounts.insert([{"name": {"first_name": "qingquan","last_name": "zeng"},"balance": 100},{"name": {"first_name": "fengxia","las
MongoDB 聚合管道使用
2016-11-25

MongoDB 聚合管道&关联处理

db.forex.insert([ { ccy: "USD", rate: 6.91, date: new Date("2018-12-21") }, { ccy: "GBP",
MongoDB 聚合管道&关联处理
2021-07-17

MongoDB 聚合管道的优化与局限

db.transactions.aggregate([ { $group: { _id: "$currency", symbols: { $push: "$symbo
MongoDB 聚合管道的优化与局限
2014-06-02

MongoDB中的聚合操作与管道使用方法是什么

在MongoDB中,聚合操作是用于对文档进行数据处理和计算的操作。聚合操作通常通过聚合管道来实现,管道是由一系列操作组成的操作链,每个操作会依次处理输入文档并将结果传递给下一个操作。聚合操作和管道的使用方法如下:使用聚合操作实现对文档的数
MongoDB中的聚合操作与管道使用方法是什么
2024-05-07

MongoDB中的聚合管道有什么限制

MongoDB中的聚合管道有以下限制:最大管道深度:管道中阶段个数的最大限制为100。最大文档大小:管道处理的每个文档的大小不能超过16MB。内存使用限制:管道执行时使用的内存默认情况下不能超过100MB,可以通过设置参数调整。超时限
MongoDB中的聚合管道有什么限制
2024-04-19

mongodb聚合管道求和的方法是什么

在MongoDB中,可以使用聚合管道(aggregation pipeline)的$group操作符来对数据进行求和。 $group操作符将文档分组,并对每个组应用累计操作,包括求和。以下是使用聚合管道进行求和的一般步骤:1. 使用$mat
2023-08-24

MongoDB聚合管道:从平均值计算到复杂数据处理的利器

聚合框架是MongoDB提供的一组功能,用于对集合中的文档进行聚合操作。聚合框架通过定义一系列操作来处理数据,这些操作按照指定的顺序进行,并将结果传递给下一个操作。每个操作都可以转换数据、过滤数据或执行计算。这些操作可以使用聚合管道来组合在

使用管道组合操作

在 DSS 工作流程中,SQL 管道是一个混合多个后续配方(每个配方都使用相同 SQL 引擎)的过程。然后,可以执行包含这些集成配方(可能是可视配方和“SQL 查询”配方)的单个作业活动。通常,SQL 查询会转换为关系代数中的表达式,即一
2023-10-22

Golang mongodb 聚合错误:管道阶段规范对象必须仅包含一个字段

问题内容我想获取过去一个月内按名称分组的计数。当我尝试在 golang mongo 客户端中运行以下查询时。我收到错误:error: 管道阶段规范对象必须仅包含一个字段。cond := &bson.D{bson.E{Key: "$cr
Golang mongodb 聚合错误:管道阶段规范对象必须仅包含一个字段
2024-02-02

如何使用MongoDB实现数据的聚合查询功能

如何使用MongoDB实现数据的聚合查询功能MongoDB是一种流行的NoSQL数据库,它以其灵活性和高性能而备受青睐。在应用程序中,数据聚合是一项常见的任务,这是将数据集合中的多个文档组合在一起,并根据特定条件进行计算的过程。在本文中,我
2023-10-22

MongoDB中$bucket聚合阶段的作用是什么

$bucket聚合阶段是MongoDB中的一种聚合操作,用于根据指定的条件将文档分组成不同的“桶”或“桶”的范围。它可以用来对文档进行分组并计算每个分组的数量或其他聚合操作。$bucket聚合阶段的作用包括:将文档按照指定条件分组成不同的
MongoDB中$bucket聚合阶段的作用是什么
2024-04-19

DISTINCT与聚合函数的结合使用

在SQL中,DISTINCT关键字用于返回唯一不重复的值,而聚合函数用于对数据进行统计或计算,例如SUM、COUNT、AVG等。这两者可以结合使用,以实现对唯一值进行统计或计算。例如,可以使用DISTINCT和COUNT结合使用,以统计某
DISTINCT与聚合函数的结合使用
2024-08-03

MybatisPlus怎么使用聚合函数

这篇文章主要介绍了MybatisPlus怎么使用聚合函数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MybatisPlus怎么使用聚合函数文章都会有所收获,下面我们一起来看看吧。首先如果使用sql是这么写的:
2023-07-05

php聚合索引怎么使用

在PHP中,聚合索引是指通过将多个字段合并成一个索引,以提高查询性能。以下是使用聚合索引的步骤:1. 创建索引:使用CREATE INDEX语句创建一个聚合索引。例如,将字段A和字段B合并成一个聚合索引:CREATE INDEX aggre
2023-10-18

编程热搜

目录