MongoDB 聚合管道使用[通俗易懂]

MongoDB 聚合管道使用[通俗易懂]数据准备 [ { “name”: { “first_name”: “qingquan”, “last_name”: “zeng” }, “balance”: 100 }, { “name”: { “…

MongoDB 聚合管道使用

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

代码100分

数据查询

$project

代码100分# 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 中使用的文档筛选语法,和读取文档时的筛选语法相同

代码100分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/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9131.html

(0)
上一篇 2023-02-14
下一篇 2023-02-15

相关推荐

  • Python创建.py文件的方法

    Python创建.py文件的方法在命令行中创建.py文件是最基础的方法。首先需要在计算机上安装Python,然后打开命令行工具,进入自己想要创建.py文件的目录下,用touch命令创建一个文件并加上后缀名.py,如下所示:

    2023-12-07
    73
  • [Oracle] oralce 11.2.0.4手动创建EM「建议收藏」

    [Oracle] oralce 11.2.0.4手动创建EM「建议收藏」这里使用的版本是RedHat7.0,Oracle 11.2.0.4 1.dbconsole启动失败 [oracle@redhat75 ~]$ emctl start dbconsole Enviro…

    2022-12-27
    100
  • 提高工作效率的Python工具库

    提高工作效率的Python工具库数据处理是Python的一个强项,对于数据分析和处理,Python提供了许多好用的工具库。例如,Pandas库可以帮助我们方便地读取数据、进行数据清洗、转换和分析等。此外,Python还可以通过其他库来进行数据自动化处理,例如:

    2024-03-15
    28
  • 优化Python性能的技巧,让你的程序跑得更快

    优化Python性能的技巧,让你的程序跑得更快a href=”https://www.python100.com/a/sm.html”font color=”red”免责声明/font/a a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-02-17
    44
  • Python中使用append方法添加元素至列表

    Python中使用append方法添加元素至列表列表是Python中常用的数据类型之一,通常用于存储一系列相似的数据。在实际开发中,我们经常需要向列表中添加元素,这里就介绍一种常见的方法——使用append方法添加元素至列表。该方法可在列表的末尾添加元素,是Python实现栈的重要方法之一。

    2024-01-21
    66
  • oracle存储过程异常怎么捕捉_查询oracle数据库状态

    oracle存储过程异常怎么捕捉_查询oracle数据库状态监控相关 数据库空间占用 SELECT pg_database.datname, pg_size_pretty ( pg_database_size ( pg_database.datname ) …

    2023-01-29
    106
  • Python字符串替换方法:轻松修改文本内容

    Python字符串替换方法:轻松修改文本内容在Python中,字符串是一种重要的数据类型。相比较其他的编程语言,Python提供了一个非常强大的字符串处理机制。在日常开发中,我们常常需要对文本内容进行修改。本文将为大家介绍Python的字符串替换方法,帮助大家轻松修改文本内容。

    2024-04-07
    23
  • Docker安装Mysql5.7[通俗易懂]

    Docker安装Mysql5.7[通俗易懂]Docker安装 系统版本:CentOS Linux release 7.5.1804 (Core) 如果之前有装过docker可以先卸载旧版本再安装,没有则跳过。 yum remove docker

    2023-02-03
    90

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注