【问题标题】:How to convert two array into an object in mongoDB where the first array has multiple same values如何将两个数组转换为mongoDB中的一个对象,其中第一个数组具有多个相同的值
【发布时间】:2021-06-23 11:57:58
【问题描述】:

在使用 mongo 聚合进行一些处理后,我有一个像这样的集合:

[{
 field1: 10,
 field2: 50,
 field3: { 
           name: ["a","b","a","a"], 
           value: [1,2,3,4]
         }
},...]

我正在努力寻找一种方法将其转换为:

[{
 field1: 10,
 field2: 50,
 a:[1,3,4],
 b:[2]
},...]

在 mongoshell 或 compass 中使用 mongo 聚合

【问题讨论】:

  • namevalue 数组的长度是否总是相等的?还有你的 MongoDB 版本是什么?
  • 是的,它总是相等的,它是 MongoDB 4.2.6 !

标签: mongodb mongodb-query mongodb-compass


【解决方案1】:

所以这个想法是:

  1. field3 中选择一个数组,比如name 以生成数组范围[0, 1, 2, 3]
  2. 同时循环遍历namevalue数组,得到{ k: "", v: "" }数组。
  3. $unwind 上一阶段用于分组的数组。
  4. field3.k 键分组以累积所有值field3.v
  5. 再次按null 分组以生成模式数组{ k: "", v: "" }
  6. field1field2 连接到前一阶段的数组中。
  7. 最后使用$arrayToObject将数组转换为对象。

试试这个:

db.testCollection.aggregate([
    {
        $addFields: {
            field3: {
                $map: {
                    input: { $range: [0, { $size: "$field3.name" }] },
                    as: "index",
                    in: {
                        k: { $arrayElemAt: ["$field3.name", "$$index"] },
                        v: { $arrayElemAt: ["$field3.value", "$$index"] }
                    }
                }
            }
        }
    },
    { $unwind: "$field3" },
    {
        $group: {
            _id: "$field3.k",
            field1: { $first: "$field1" },
            field2: { $first: "$field2" },
            k: { $first: "$field3.k" },
            v: { $push: "$field3.v" }
        }
    },
    {
        $group: {
            _id: null,
            field1: { $first: "$field1" },
            field2: { $first: "$field2" },
            array: {
                $push: { k: "$k", v: "$v" }
            }
        }
    },
    {
        $addFields: {
            array: {
                $concatArrays: [
                    [{ k: "field1", v: "$field1" }, { k: "field2", v: "$field2" }],
                    "$array"
                ]
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: { $arrayToObject: "$array" }
        }
    }
]);

输出

{
    "field1" : 10,
    "field2" : 50,
    "a" : [
        1,
        3,
        4
    ],
    "b" : [
        2
    ]
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-08-27
  • 2021-07-24
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多