MongoDb 聚合 - 项目值作为键,相应的数组值作为值

2024-04-25

在 mongodb 中,运行聚合后我有一个以下形状的 get 对象。

 {
      "_id": 1,
      "specificationList": {
        "key": "Memory & Storage Features",
        "values": [
          {
            "key": "Internal Storage",
            "value": [
              "32 KB"
            ]
          },
          {
            "key": "RAM",
            "value": [
              "32 MB"
            ]
          },
          {
            "key": "Expandable Storage",
            "value": [
              "8 GB"
            ]
          },
          {
            "key": "Supported Memory Card Type",
            "value": [
              "MicroSD"
            ]
          }
        ]
      }
    }

从上面的文档中,我如何在下一个聚合管道中获取以下形状的对象。我需要达到以下形状以使代码更清晰。我正在使用聚合来达到上面的形状(所以想附加另一个管道),并且很高兴知道要获得下面的形状的聚合管道

{
 "specList” : {
    “Internal Storage”: “32 KB”,
   “RAM”:”32 MB”,
   “Expandable Storage”:”8 GB”,
    “Supported Memory Card Type”:”MicroSD”
   }
}

在不知道完整管道的情况下,您可以使用$arrayToObject https://docs.mongodb.com/manual/reference/operator/aggregation/arrayToObject/运算符将数组转换为单个文档,但数组必须包含两个字段,k and v哪里的k字段包含字段名称和v字段包含字段的值。在上面的汇总文档中,您需要映射 值数组为上述格式$arrayToObject https://docs.mongodb.com/manual/reference/operator/aggregation/arrayToObject/然后操作员就可以愉快地进行转换了。

考虑添加一个$project https://docs.mongodb.com/manual/reference/operator/aggregation/project/管道步骤使用$map https://docs.mongodb.com/manual/reference/operator/aggregation/map/运算符更改数组结构,然后将转换结果应用到所需的对象。

下图说明了这一点:

db.collection.aggregate([
    { ... }, // <-- previous pipeline
    {
        "$project": {
            "specList": {
                "$arrayToObject": {
                    "$map": {
                        "input": "$specificationList.values",
                        "as": "el",
                        "in": {
                            "k": "$$el.key",
                            "v": { "$arrayElemAt": ["$$el.value", 0] }
                        }
                    }
                }
            }
        }
    }
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDb 聚合 - 项目值作为键,相应的数组值作为值 的相关文章

随机推荐

  • 如何从 ispell 私人词典中删除条目?

    我想知道如何从 ispell 私人词典中删除一个 错误插入的 条目 单词 EDIT 经过更多挖掘后 我仍然无法从默认字典中删除条目 但我认为解决方案可能是构建哈希程序 问题是生成要删除的条目列表 我找不到简单的示例 您应该能够编辑您的个人词
  • 使用 Shell 脚本自动安装 R-Studio

    有没有办法在 Linux 系统上自动安装 R Studio 它应该自动检测操作系统并安装具有所需依赖项的 R 和 R Studio 谢谢 我准备了以下 shell 脚本来使安装完全自动化 bin bash Program R Studio
  • 使用 Retrofit 通过 GSON 获取嵌套 JSON 对象

    我正在使用 Android 应用程序中的 API 所有 JSON 响应如下所示 status OK reason Everything was fine content lt some data here gt 问题是我所有的 POJO 都
  • 在 JavaScript 中动态创建 SVG 链接

    我正在从 JavaScript 动态创建 SVG 元素 它对于像矩形这样的视觉对象工作得很好 但是我在生成功能性的 xlinks 时遇到了麻烦 在下面的示例中 第一个矩形 静态定义 在单击时可以正常工作 但其他两个 用 JavaScript
  • Oracle SQL Regexp_replace 匹配

    这是我需要完成的一个时髦的匹配 A5 1 9 11 2 需要成为 A05 01 09 11 02 DOT 部分的数量从没有到很多不等 字母 A 将始终存在并且始终为 1 个字符 我想使用 regexp replace 函数 以便将其用作排序
  • 检查节点js中特定时区的午夜

    比方说 我有用户的时区 时区 America New York 我想根据用户的时区在午夜执行一些任务 如何检查该时区是否已到达午夜 特定时区的最后午夜 new Date new Date toLocaleDateString en US t
  • 结束两个对等方之间的 WebRTC 视频通话

    我已经使用以下命令在两个同伴之间建立了视频聊天WebRTC 我想让一个对等方结束聊天 并让另一个对等方知道聊天已结束 聊天结束后 需要为双方执行一些代码 这PeerConnection对象有一个removeStream 应该触发的方法onr
  • 颤振中的全宽浮动操作按钮? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何在不使用颤动屏幕底部填充的情况下实现全宽浮动操作按钮 您可以使用不同的方法 您可以使用堆栈实现相同的
  • C# 计算并验证 SEPA (XML) 付款文件的 SHA256 值

    我正在与马库斯 德雷尔 Markus Dreyer 一样面临同样的问题 C 计算 SEPA XML 付款文件的 SHA256 值 https stackoverflow com questions 18254277 c sharp calc
  • SSMS:在脚本中选择字符串时突出显示相同的文字

    在 Visual Studio 中 当我选择任何文字时 它会突出显示同一文字的所有出现位置 SQL Server Management Studio中有类似的功能吗 假设我的脚本中有 My Temp Table 当选择文字 My Temp
  • 云集成:创建项目时出错。请重试

    我创建了一个新的 GAE 应用程序 但 设置 页面上的 云集成 部分告诉我 创建项目时发生错误 请重试 我在几个小时内多次按下 重试 按钮 但它不起作用 我发现 它反复说问题已解决 但对我来说还没有解决 有人来自 Google 监控这个论坛
  • 使用 grunt 从 browserify 生成源映射

    我已按照此处的说明进行操作 https www npmjs org package grunt browserify https www npmjs org package grunt browserify 尝试在 grunt 上为 bro
  • Aurelia Post 使用 http-fetch-client 生成选项请求

    我正在创建一个小型论坛 我们公司的人员可以使用 aurelia 为他们想要即时销售的商品或服务发布广告 我有一个广告页面列表 工作正常 每个广告的详细信息页面都工作正常 都使用来自 api 的 get 请求 然而 当有人想在广告上添加评论时
  • 删除列表中不包含另一个列表中出现的子字符串的项目的优雅方法

    最近我遇到了这个问题 假设有一个我要处理的内容列表 process list test fruit apple test fruit pineapple test fruit banana test tech apple pen test
  • 如何使用 antd upload React 发送 multipart/form-data

    我正在使用 React 和 antd 我使用的 antd 组件是拖放 https ant design components upload 我正在尝试使用 FormData 对象发送多部分 表单数据 它发送文件 应作为 blob 发送的 z
  • 有什么方法可以更改 VSCode 中仅注释代码的字体系列吗?

    我在用户设置中遇到过这个 editor fontFamily Consolas Courier New monospace 但有什么办法只改变评论的字体吗 我在其他编辑器中看到人们有半草书评论 我希望能够复制类似的内容 您可以更改字体sty
  • .NET 中的 CoCreateInstance 完全匹配吗?

    我有进程内 DLL COM 服务器 但我选择以 DllSurrogate 身份运行 因此从非托管代码 Delphi 中我有 function TComWrapper GetServer IUnknown begin OleCheck CoC
  • 如何在Android webview中永久保存cookie?

    通过下面的代码 我已经能够保存 cookie 但是一旦我关闭应用程序 cookie 就会消失 这是如何引起的以及如何解决 package com jkjljkj import android app Activity import andr
  • 修复js“脚本错误”

    我在实现一些简单的事情时遇到困难 我有一个 index html 文件http 本地主机 3200 http localhost 3200由 ruby on Rails 编写 它使用 javascript 文件http 本地主机 8000
  • MongoDb 聚合 - 项目值作为键,相应的数组值作为值

    在 mongodb 中 运行聚合后我有一个以下形状的 get 对象 id 1 specificationList key Memory Storage Features values key Internal Storage value 3