聚合 MongoDB 中子文档的总计

2024-02-14

我有一个如下所示的文档,我本质上想为子文档中的项目生成一个聚合。

本质上,每个文档都是一个销售记录,其中包含销售详细信息和包含每个商品销售数量的子文档/数组。

我想生成所有已售商品的摘要。

因此,一个示例集合是:

{
  non_relevant_1: "ABC",
  non_relevant_2: "DEF",
  items_array: {
    "item_1": 1,
    "item_2": 2,
    "item_3": 1,
    "item_4": 1
    }
},

{
  non_relevant_1: "HIJ",
  non_relevant_2: "KLM",
  items_array: {
    "item_1": 3,
    "item_2": 2,
    "item_3": 4
    }
}

然后我希望能够制作出类似的东西:

{
items_array: {
    "item_1": 4,
    "item_2": 4,
    "item_3": 5,
    "item_4": 1
    }
}

提前谢谢了。


我认为您需要更改架构,您正在将数据保存在键中。 MongoDB 运算符不会具有未知的键,例如,我们无法按未知的键进行分组。为了做到这一点,我们会执行复杂且缓慢的操作,例如$objectToArray.

您想要作为结果的数据也有同样的问题。

如果你只看中间的查询$unwind and $group将需要它,具有更改的架构,并要求键中没有数据的数据。

我的意思是代替

items_array: {
    "item_1": 1,
    "item_2": 2,
    "item_3": 1,
    "item_4": 1
    }

您的集合应该类似于(查询的第一部分会更改您的架构)

items_array: [
    {"name" "item_1",
     "qty" : 1},
    {"name" "item_2",
     "qty" : 2},
    {"name" "item_3",
     "qty" : 1},
    {"name" "item_4",
     "qty" : 1}
    ]

此外,结果应该只有已知的键。 也许你陷入困境的原因是。你会让事情变得更容易。

测试代码在这里 https://mongoplayground.net/p/aCiHmzu-dpa

Query(查询适用于您的模式,但我告诉您我的想法)

db.collection.aggregate([
  {
    "$addFields": {
      "items_array": {
        "$map": {
          "input": {
            "$map": {
              "input": {
                "$objectToArray": "$items_array"
              },
              "as": "m",
              "in": [
                "$$m.k",
                "$$m.v"
              ]
            }
          },
          "as": "item",
          "in": {
            "name": {
              "$arrayElemAt": [
                "$$item",
                0
              ]
            },
            "qty": {
              "$arrayElemAt": [
                "$$item",
                1
              ]
            }
          }
        }
      }
    }
  },
  {
    "$unwind": {
      "path": "$items_array"
    }
  },
  {
    "$group": {
      "_id": "$items_array.name",
      "total-qty": {
        "$sum": "$items_array.qty"
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "items_array": {
        "$push": {
          "$map": {
            "input": {
              "$map": {
                "input": {
                  "$objectToArray": "$$ROOT"
                },
                "as": "m",
                "in": [
                  "$$m.k",
                  "$$m.v"
                ]
              }
            },
            "as": "i",
            "in": {
              "$arrayElemAt": [
                "$$i",
                1
              ]
            }
          }
        }
      }
    }
  },
  {
    "$project": {
      "_id": 0
    }
  },
  {
    "$addFields": {
      "items_array": {
        "$arrayToObject": "$items_array"
      }
    }
  }
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聚合 MongoDB 中子文档的总计 的相关文章

随机推荐

  • PyCharm:为什么“音频”受到青睐?

    为什么audioop如果我想进口 请优先选择reverse 我的代码包含from django urls import reverse已经存在于许多文件中 为什么 PyCharm 不查看我的其他文件 然后将当前的第二个选项设为第一个选项 我
  • “目录名称无效。”等等,在Windows上使用rabbitmq-plugins

    我正在尝试通过以下方式让 RabbitMQ 在 Windows 10 上运行这些说明 http arcware net installing rabbitmq on windows 但是 当尝试通过 powershell 命令启用管理插件时
  • 使用 vue.js 获取调用元素

    我想获取 vue js 中调用 html 元素以通过 jQuery 修改它 现在 我为每个元素指定类名 索引 然后通过 jQuery 调用它 但这看起来像是一个疯狂的 hack 我想做的事 new Vue el app data testF
  • 为什么中序和前序遍历对于创建算法来确定 T2 是否是 T1 的子树很有用

    我正在看一本采访书 问题是 你有两个非常大的二叉树 T1 拥有数百万个节点 并且T2 有数百个节点 创建一个算法来决定是否T2是一个 的子树T1 作者提到这是一个可能的解决方案 请注意 这里的问题指定T1有数百万 节点 这意味着我们应该注意
  • 无法从 NGINX 获取包含句点的标头

    标题 Abp TenantId is null因为 如果删除 like AbpTenantId 一切都会安好的 如何添加标题 localhost debug 显示临时标头 根据客户请求显示 Request Headers Unknown 在
  • Material UI 网格列表行有一个很大的尴尬间隙

    我正在使用 Material UI 和 Reactjs 我对网格列表组件有疑问 我尝试使用网格 1000x1000px 因此我将自定义 gridList 样式中的高度和宽度分别指定为 1000 和 1000 如文档中所示 应有 10 列 每
  • 在多个节点上运行kafka connect分布式模式

    我正在测试一个卡夫卡连接器的弹性 我想在它运行时杀死一个工作人员 从而杀死连接器实例 最简单的方法可能是强制分布式模式在多个节点上运行 然后终止该节点上的工作进程 对吗 如何使 Kafka 将生成工作程序连接到不仅仅是其启动的节点上 这是在
  • 如何调试 Mac OS X 上的互斥锁问题?

    我正在尝试让 gdb lldb 存根为我正在制作的程序工作 现在它似乎使调试器陷入僵局 所以我 讽刺的是 在我的机器上调试 lldb 以尝试找出问题所在 lldb 正在尝试锁定互斥体 并且似乎陷入僵局 在 Windows 上 我知道你可以使
  • java连接到sql server 2008express

    我尝试连接到我的 BD 这是我的代码 public class JavaSQLTest param args the command line arguments public static void main String args tr
  • 运行scala代码jar出现NoSuchMethodError:scala.Predef$.refArrayOps

    我的代码在idea中通过本地模式可以正常运行 当我打印成jar包上传到我部署的SPARK服务器上运行时 出现NoSuchMethodError scala 预定义 refArrayOps 出现了 出错的那行代码如下val expectArr
  • 单元测试应该涵盖压力测试吗?

    我想知道你们是否有任何好的读物来考虑将什么分类为单元测试 验收 集成测试 我有以下场景 我们在工作中就是否应该在单元测试中进行了一些辩论 在我们的数据访问层 有些语句使用了sql比如 select from people where id
  • 使用 C# 发送 Outlook 会议请求

    我希望从 C 发送 Outlook 会议请求 我有下面的代码 它可以完成这项工作 但是 string startTime1 Convert ToDateTime startTime ToString yyyyMMddTHHmmssZ str
  • 方法调用可能会产生 java NullpointerException

    我有一个代码 public String getNameUpdateEvent long id Cursor mCursor db rawQuery select name from events WHERE id id null if m
  • 带模板参数的 C++ 函数调度

    我正在重构一个大类 我们称之为Big 有大量的复制粘贴代码 大部分复制粘贴代码存在于switch case只有涉及的类型最终不同 该代码是基于一个切换enum类的成员变量 其值仅在运行时才知道 我尝试解决这个问题需要有一个Dispatche
  • Azure Pipelines DotNetCoreCLI - .Net Core SDK 生命周期结束

    我在 Azure CI 管道中收到错误 尝试运行 DotNetCoreCLI 时restore task 已经报废了几个小时的网络无济于事 相关问题没有解决方案可以帮助我理解问题 基本上 我们已经在存储库中添加了一个新项目 该项目需要运行
  • 大整数的按位运算

    我正在实现 BER 压缩整数的解码 最近我发现了与大整数按位运算相关的奇怪 JavaScript 行为 E g var a 17516032 has 25 bits alert a lt lt 7 outputs 2052915200 al
  • 哪些 x86 C++ 编译器本身是多线程的?

    现在 几乎每个用户在台式机上 以及大量笔记本电脑上 都拥有 2 或 4 个核心 高级用户拥有 6 12 个 AMD 或 i7 核心 哪些 x86 x86 64 C C 编译器可以使用多个线程进行编译 已经有一个 make j N 类似的解决
  • 我使用的是哪个版本的 python time 模块

    如何确定安装了哪个版本的 python 模块 time 对于其他模块 version version or version 工作 但是时间上 这两种方法都会返回错误 模块 对象没有属性 version 或 版本 Module time内置于
  • Google Analytics Regex - 无负向前瞻的替代方案

    Google Analytics 分析 在其过滤器中不再允许负向前瞻 事实证明 创建仅包含我希望包含的链接的自定义报告非常困难 包含负向前瞻的正则表达式在启用时可以工作 test com index php s 这匹配 test com t
  • 聚合 MongoDB 中子文档的总计

    我有一个如下所示的文档 我本质上想为子文档中的项目生成一个聚合 本质上 每个文档都是一个销售记录 其中包含销售详细信息和包含每个商品销售数量的子文档 数组 我想生成所有已售商品的摘要 因此 一个示例集合是 non relevant 1 AB