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

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

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

Как можно сгенерировать агрегированный вывод путем изменения поля _id внутри 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 Ответ

2 голосов
/ 16 января 2020

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