如何在mongodb中按多列和多个值进行分组

2024-01-03

Mongodb 集合 -

[
{ name: 'name 1', call: 'Success Call' },
{ name: 'name 1', call: 'Repeat Call' },
{ name: 'name 3', call: 'Repeat Call' },
{ name: 'name 3', call: 'Unsuccess Call' }
{ name: 'name 2', call: 'Success Call' },
{ name: 'name 2', call: 'Repeat Call' }
{ name: 'name 2', call: 'Repeat Call' }
{ name: 'name 2', call: 'Unsuccess Call' }
.
.
.
.
]

我点击了这个链接使用聚合框架对多个列进行分组和求和 https://stackoverflow.com/questions/16633669/is-it-possible-to-group-and-sum-multiple-columns-with-mongodbs-aggregation-fram并最终得到这个输出。

[
{
    "_id": 1,
    "Calls": [
        {
            "call": "Repeat Call",
            "callCount": 2
        },
        {
            "call": "Unsuccess Call",
            "callCount": 1
        },
        {
            "call": "Success Call",
            "callCount": 1
        }
    ],
    "Names": [
        {
            "name": {
                "name": "name 4"
            },
            "nameCount": 1
        },
        {
            "name": {
                "name": "name 3"
            },
            "nameCount": 1
        },
        {
            "name": {
                "name": "name 1"
            },
            "nameCount": 2
        }
    ]
}
]

而我实际上需要这样的东西

[
{
    "name": "name 4",
    "nameCount": 1,
    "Success Call":1,
    "Unsuccess Call":0,
    "Repeat Call":0
},
{
    "name": "name 3",
    "nameCount": 1,
    "Success Call":2,
    "Unsuccess Call":3,
    "Repeat Call":1
},
{
    "name": "name 1",
    "nameCount": 2,
    "Success Call":1,
    "Unsuccess Call":1,
    "Repeat Call":1
}
]

谁能帮我解决这个问题吗?提前致谢!


在聚合管道中,对于 MongoDB 版本 3.6 及更高版本,您可以利用$arrayToObject https://docs.mongodb.com/manual/reference/operator/aggregation/arrayToObject/操作员和一个$replaceRoot https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/管道以获得所需的 JSON 输出。这对于调用字段的未知值非常有效。

您需要运行以下聚合管道:

db.collection.aggregate([
    { "$group": {
        "_id": { 
            "name": "$name",
            "call": "$call"
        },
        "count": { "$sum": 1 }
    } },
    { "$group": {
        "_id": "$_id.name",
        "counts": {
            "$push": {
                "k": "$_id.call",
                "v": "$count"
            }
        },
        "nameCount": { "$sum": 1 }
    } },
    { "$replaceRoot": { 
        "newRoot": { 
            "$mergeObjects": [ 
                { "$arrayToObject": "$counts" }, 
                "$$ROOT" 
             ] 
        } 
    } },
    { "$project": { "counts": 0 } }
])

对于不支持上述运算符的早期 MongoDB 版本,请利用$cond https://docs.mongodb.org/manual/reference/operator/aggregation/cond/#exp._S_cond运算符在$group https://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group阶段根据已知的情况评估计数call值,如下所示:

db.collection.aggregate([
    { "$group": {
        "_id": "$name",
        "nameCount": { "$sum": 1 },
        "Success Call": {
            "$sum": {
                "$cond": [ { "$eq": [ "$call",  "Success Call" ] }, 1, 0]
            }
        },
        "Repeat Call": {
            "$sum": {
                "$cond": [ { "$eq": [ "$call",  "Repeat Call" ] }, 1, 0]
            }
        },
        "Unsuccess Call": {
            "$sum": {
                "$cond": [ { "$eq": [ "$call",  "Unsuccess Call" ] }, 1, 0]
            }
        }
    } },
    { "$project": {
        "_id": 0, 
        "name": "$_id",
        "nameCount": 1,
        "Success Call":1,
        "Unsuccess Call":1,
        "Repeat Call":1               
    } }
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在mongodb中按多列和多个值进行分组 的相关文章

随机推荐

  • Moqui 部署到 Elastic Beanstalk Tomcat 实例上的 AWS

    背景 我们已经使用 Java 环境在 Elastic Beanstalk 上运行带有嵌入式 Jetty 服务器的 Moqui 2 0 大约一年了 出于安全原因 我们让应用程序与 Postgres 数据库一起在私有子网中运行 并通过 VPN
  • Mosquitto套接字读取错误Arduino客户端

    我刚刚从 Github 下载了最新的 Arduino 库代码 它破坏了我的 MQTT 客户端程序 我在 Arduino 上使用 PubSubClient 1 91 在 Mac OSX 上使用 Mosquitto 1 1 2 Build 20
  • data.table 1.8.x Mean() 函数自动删除 NA?

    今天我发现我的程序中存在一个错误 原因是data table自动删除NA for mean 例如 gt a lt data table a c NA NA FALSE FALSE b c 1 1 2 2 gt a gt a list mea
  • 监听短信删除android

    我正在寻找用户从收件箱中删除短信的侦听器 Android 中用于删除短信的任何侦听器 https stackoverflow com questions 5025372 any listener for delete sms in andr
  • 经典 ADO.NET 还在使用吗?

    经典的 ADO NET 是否仍然广泛使用并被许多开发人员用于插入 读取数据等 尽管我们现在有 LINQ 和 EF 是的 在某些情况下仍然使用它 在我的日常工作中 我们有几个使用 SQL 大容量复制的情况 这需要良好的连接和命令 此外 SQL
  • 有没有办法刷新 POSIX 套接字?

    是否有一个标准调用可以将 POSIX 套接字的发送端一直刷新到远程端 或者是否需要将其作为用户级协议的一部分来实现 我查看了常见的标题 但找不到任何东西 设置 TCP NODELAY 然后将其重置回来怎么样 也许可以在发送重要数据之前或完成
  • 使用未知分隔符进行 Unix 排序(最后一列)

    我的数据如下所示 Adelaide Crows 5 2 3 0 450 455 460 67 8 Essendon 5 5 0 0 622 352 955 88 20 Fremantle 5 3 2 0 439 428 598 50 12
  • 使用 ffmpeg 添加不透明度叠加

    我的 ffmpeg 有问题 我尝试在视频上添加 png 文件 我发现如何添加 只是我希望这个 png 文件有一些不透明度 我尝试了这条线 ffmpeg n i video mp4 i logo png filter complex sets
  • 对有连字符的字母数字数据进行排序

    我的工作簿中有两张表 每张表都有自己的电子邮件地址列以及其他数据 我将引用 Sheet1 中的 Column1 和 Sheet2 中的 Column2 其中只有 Column1 可能列出了重复的电子邮件地址 我需要确定 Column1 中的
  • Oracle sql 中“%Type”是什么意思?

    我第一次体验 Oracle 和 TOAD 我知道 SSMS 我在更新过程中的输入参数旁边遇到了这个 Type 但我不知道它是什么或意味着什么 我在 Google 上找到了与 Rowtype 相关的链接 是相同的东西还是完全不同的东西 如果这
  • 在一行中获取 Stream/List 的最后一个元素

    如何在以下代码中获取流或列表的最后一个元素 Where data careas is a List
  • java中的分解,什么时候才够呢?

    我是计算机科学专业一年级的学生 我们目前正在使用 java 进行编程 我经常尝试将程序分解为命名良好的方法 以便我的主方法逻辑可以尽可能接近伪代码地读取 我发现的问题是 我常常最终编写了如此多的小型私有方法 以至于我觉得我可能做得太过了 在
  • 数据建模 3 路表 has_many 关联

    我正在尝试构建一个表来处理某个营销活动已设置为的位置和类别 并具有以下模型关联 class Campaign lt ActiveRecord Base has many campaign category metro bids depend
  • 使用 EL 变量动态地将 ID 分配给标签

    我想循环一些 客人 并动态插入一个id
  • 自引用实体循环依赖仅发生在 EF Core 6.0 上

    描述 我认为这是一个 EF Core 6 0 错误 但我想在向 EF Core GitHub 存储库提交错误之前检查此处 我完全不确定这是否是一个错误 至少我认为这是一种意想不到的行为 在迁移到 NET 6 后 此行为首次出现 我已成功在由
  • 使用 element-ui 和 vue-test-utils 模拟 select

    我正在 Vue 中使用 Jest 和 Element ui 在一个包含带有 2 个选项的选择的组件上进行单元测试 我从下拉列表中选择一个选项 然后检查是否已调用某个操作 1 与正常select and optionHTML 标签效果很好 水
  • sql中多个商店的价格比较

    create table Products id int ProductName varchar 200 ProductCategory varchar 200 ProductImage varchar 200 ProductUri var
  • 将 std::integer_sequence 作为模板参数传递给元函数

    我怎样才能通过std integer sequence作为元函数的模板参数 即不是函数模板 给定例如以下用例 但不限于此 我想使用整数序列来删除最后一个N来自参数包的类型 我以为我可以用selector from 这个问题 https st
  • 如何更改 PropertyGrid 控件的边框颜色(或删除边框)?

    拥有标准的 WinForms 2 0PropertyGrid control http msdn microsoft com en us library system windows forms propertygrid aspx我正在寻找
  • 如何在mongodb中按多列和多个值进行分组

    Mongodb 集合 name name 1 call Success Call name name 1 call Repeat Call name name 3 call Repeat Call name name 3 call Unsu