MongoDB объединяет два поля, используя агрегацию, где фактическое поле находится в массиве

У меня есть документ на монго, как показано ниже;

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

Как можно сгенерировать агрегированный вывод путем изменения поля $info.batch внутри elements путем объединения $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 ответ


С помощью приведенного ниже запроса мы batchElements.elements итерацию по batchElements.elements и формируем объекты с type & _id & finally $map , чтобы batchElements.elements массив объектов обратно в 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"] } }] } */
            }
        }
    }
}])

Есть идеи?

10000