Как объединить 2 массива в зависимости от состояния в mongoDb - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть коллекция заказов, в которой есть поле товаров [ { itemId: ObjectId, quantity: number } ]

Я хочу заполнить itemId соответствующим документом с использованием агрегации, но на этапе поиска создается отдельный массив

Желательно результат: [ { itemId: {} , quantity: number } ]

Пробовал: Агрегирование пи c

Есть ли способ объединить эти массивы как таковые, я получаю желаемый результат или есть какие-либо другие путь?

1 Ответ

0 голосов
/ 05 февраля 2020

Не могли бы вы просто использовать операции $ unwind и $ project для перезаписи поля itemId после выполнения поиска $?

Примерно так:

db.orders.aggregate([{
    "$lookup": {
        "from": "items",
        "localField": "itemId",
        "foreignField": "_id",
        "as": "item"
    }
}, {
    "$unwind": "$item"
}, {
    "$project": {
        "_id": 0,
        "itemId": "$item",
        "quantity": 1
    }
}]);

ОБНОВЛЕНИЕ

Посмотрев, как выглядят данные, вы можете попробовать сделать что-то вроде этого:

db.orders.aggregate([{
    "$unwind": "$items"
}, {
    "$lookup": {
        "from": "items",
        "localField": "items.itemId",
        "foreignField": "_id",
        "as": "item"
    }
}, {
    "$unwind": "$item"
}, {
    "$group": {
        "_id": "$_id",
        "items": {
            "$push": {
                "itemId": "$item",
                "quantity": "$items.quantity"
            }
        }
    }
}]);

Первый $ unwind превращает массив элементов в отдельные объекты, которые затем могут быть используется в $ lookup для получения их записи из коллекции элементов. Второй $ unwind делает то же самое для поля нового элемента. И последняя группа $ объединяет все обратно на основе исходного _id из заказов, а $ pu sh переформатирует поле элементов в то, что вы хотите.

...