【问题标题】:Project array elements as individual fields将数组元素投影为单个字段
【发布时间】:2021-08-06 23:57:56
【问题描述】:

我有一个集合,每个文档中都有一个字段,如下所示:

{
   person = [{"name":"Alex"},{"name":"Betsy"},{"name":"Chauncy"}]
}

此数组的文档可以有不同的长度 我正在尝试将此数组的单个元素投影为同一文档中的字段,其中键为Name {index},名称对应的值。给定一个数组,我似乎无法生成投影字段。

预期输出:

[{
"name1": "Alex",
"name2": "Betsy",
"name3": "Chauncy"
}]

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    你可以使用聚合

    • $unwind 解构数组,也有助于获取索引
    • $group 用 key (k): value(v) 对重建数组,这有助于下一阶段
    • $arrayToObject 由于组已经创建了 k:v 对,这有助于使数组成为 opbect
    • $replaceRoot 有助于将对象设为根

    这里是代码

    db.collection.aggregate([
      {
        $unwind: { path: "$person", includeArrayIndex: "index" }
      },  
      {
        $group: {
          _id: null,
          person: {
            $push: {
              k: { "$concat": [ "name", { $toString: "$index" } ] },
              v: "$person.name"
            }
          }
        }
      },
      {
        $project: {
          person: { "$arrayToObject": "$person" }
        }
      },
      {
        "$replaceRoot": { "newRoot": "$person" }
      }
    ])
    

    工作Mongo playground

    【讨论】:

    • 我之前尝试过使用 $unwind,但这会为每个数组元素创建一个新文档。我想将所有元素保留在同一个文档中(由于原始文档很大,我投影了很多其他字段)。我要做的是在每个 name 键上附加它的索引,并将其投影为键和它的值。
    • 你能用预期的输出更新问题吗
    • 我已经用预期的输出更新了问题
    • @ChiragBansal 我已经更新了我的答案。请看一下
    猜你喜欢
    • 2022-07-24
    • 2023-03-31
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多