MongoDB聚合:在数组中的实际字段上连接两个字段

3

我有一个类似下面的MongoDB文档:

{
    "_id" : "123",
    "info" : {
        "batch" : "Batch1-Minor"
    },
    "batchElements" : {
        "elements" : [ 
             {
               "_id" : "elementId1",
               "type": "ABC"
             },  
             {
                "_id" : "elementId2",
                "type": "ABC"
             }
        ]
    }
}

如何通过将elements中的_id字段更改为$info.batch$batchElements.elements._id的连接,生成聚合输出。 期望输出:
{
    "_id" : "123",
    "info" : {
        "batch" : "Batch1-Minor"
    },
    "batchElements" : {
        "elements" : [ 
             {
               "_id" : "Batch1-Minor-elementId1",
               "type": "ABC"
             },  
             {
                "_id" : "Batch1-Minor-elementId2",
                "type": "ABC"
             }
        ]
    }
}

1
聚合查询无法写回到同一集合,它们的主要目的是查询而不是更新,尽管有两个阶段 $out-- 如果存在则将覆盖集合或创建新的 & $merge - 将写入新集合或创建新的(这两个都不是我们在寻找的),因此必须进行正常的更新过程。mongoDB版本是什么? - whoami - fakeFaceTrueSoul
1
抱歉让您感到困惑,我不想更新现有的集合。我该如何编写聚合阶段(主要是addFields)来生成输出结果。我将在原始问题中进行编辑。 - Boat
1个回答

3
使用以下查询,我们正在遍历batchElements.elements并使用type_id形成对象,最后$map会将对象数组推回batchElements.elements,其中$addFields将字段添加到实际文档中,请尝试此操作:
db.yourCollectionName.aggregate([{
    $addFields: {
        'batchElements.elements': {
            $map:
            {
                input: "$batchElements.elements",
                as: "each",
                in: { type: '$$each.type', '_id': { $concat: ["$info.batch", "-", "$$each._id"] } }
               /** So if you've multiple fields in each object then instead of listing all, You need to use 
                in: { $mergeObjects: ["$$each", { '_id': { $concat: ["$info.batch", "-", "$$each._id"] } }] } */
            }
        }
    }
}])

“batchElements.elements”中除了“_id”和“type”之外,可能有许多其他字段。 有没有避免在“in”子句中提及所有这些字段的方法? - Boat
@Boat:是的,我也怀疑这一点,你可以尝试更新查询 :-) - whoami - fakeFaceTrueSoul

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