mongodb - 如何将两个数组转换为 mongoDB 中的对象,其中第一个数组具有多个相同的值

标签 mongodb mongodb-query mongodb-compass

在使用 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 或指南针中使用 mongo 聚合

最佳答案

所以这个想法是:

  • field3 中选择一个数组说 name生成数组范围 [0, 1, 2, 3] .
  • 循环 namevalue array 同时得到一个数组 { k: "", v: "" } .
  • $unwind用于分组的前一阶段的数组。
  • 按关键字分组 field3.k累积所有值 field3.v .
  • 再次分组 null生成模式数组 { k: "", v: "" } .
  • 连接 field1field2从前一阶段进入数组。
  • 最后使用 $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
        ]
    }
    

    关于mongodb - 如何将两个数组转换为 mongoDB 中的对象,其中第一个数组具有多个相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66820602/

    相关文章:

    mongodb - robomongo aws ec2 ubuntu

    c# - 如何将 List<T> 转换为 BsonArray 以保存 MongoDB 文档

    mongodb - 使用 MongoDB 在子文档中查找项目

    java - Java中使用ehcache RMI的分布式缓存

    javascript - 使用mongodb在javascript中创建多个数组的一个数组

    mongodb - 如何将 mongo 命令生成为平面文件

    MongoDB:如何重新排序过去困惑的文档字段

    mongodb - 从 Schema 中查看 MongoDB Compass 中的 20 多个最新文档

    python - MongoDB - 显示数据库中的所有文件

    mongodb - 使用 MongoDB 通过引用对象进行文本查询