使用Mongo聚合根据字段名称收集数组元素

3

我有一个聚合的Mongo文档,如下所示。有两个不同的批次("-Minor"和"-Major"),每个批次也有"batchElements"。

{
    "_id" : "123",
    "info" : {
        "batch" : "Batch1-Minor"
    },
    "batchElements" : {
        "elements" : [ 
             { },  { }, .... { }
        ]
    }
},
{
    "_id" : "123",
    "info" : {
        "batch" : "Batch2-Minor"
    },
    "batchElements" : {
        "elements" : [ 
             { },  { }, .... { }
        ]
    }
},
{
    "_id" : "123",
    "info" : {
        "batch" : "Batch3-Major"
    },
    "batchElements" : {
        "elements" : [ 
             { },  { }, .... { }
        ]
    }
},
{
    "_id" : "123",
    "info" : {
        "batch" : "Batch4-Major"
    },
    "batchElements" : {
        "elements" : [ 
             { },  { }, .... { }
        ]
    }
}

我该如何收集所有以"-Minor"和"-Major"结尾的"batchElements",并创建以下文档;

输出:

  {
    "_id" : "123",
    "minorElements" : [
        [{}, {}, {}, ..... {} ], // elements of "Batch1-Minor"
        [{}, {}, {}, ..... {} ], // elements of "Batch2-Minor"
        ...                      // elements of "BatchN-Minor"
    ],
    "majorElements" : [
        [{}, {}, {}, ..... {} ], // elements of "Batch3-Major"
        [{}, {}, {}, ..... {} ], // elements of "Batch4-Major"
        ...                      // elements of "BatchN-Major"
    ]
}
1个回答

2
您可以从使用 $split 开始,来获取您的批次中 "type" 作为 $group _id 的一部分。然后您可以运行另一个 $group 将同一文档的minormajor 部分组合在一起。在最后一步中,您需要使用$replaceRoot$arrayToObject 将两个数组提升到根级别。
db.collection.aggregate([
    {
        $group: {
            _id: {
                id: "$_id",
                type: { $arrayElemAt: [ { $split: [ { $toLower: "$info.batch" }, "-" ] }, 1 ] }
            },
            docs: { $push: "$batchElements.elements" }
        }
    },
    {
        $group: {
            _id: "$_id.id",
            data: { $push: { k: { $concat: ["$_id.type","Elements"] }, v: "$docs" } }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: [ { _id: "$_id" }, { $arrayToObject: "$data" } ]
            }
        }
    }
])

Mongo Playground


1
在第二个“group”中,“$_id.id”是什么意思? - JBone
在该阶段中,引用原始的“_id”字段作为唯一的分组键。 - mickl
太棒了@mickl,这个方法很好用。非常感谢你。元素内部有一个_id字段。我该如何通过连接$info.batch和$elements._id来替换每个$elements._id字段的值?例如:"_id": "Batch4-Major-elementId1" - Boat
@Boat $concat 接受一个字符串数组,因此您可以在其中添加破折号和其他参数。请参阅 https://docs.mongodb.com/manual/reference/operator/aggregation/concat/。 - mickl
在 $concat 内部? - Boat
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接