Элемент вложенного массива mongodb $ lookup - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть две коллекции, orders и products. Мне нравится объединять все коллекции от order.items[] до products, чтобы добавить дополнительные поля в items[]

Пример данных:
Заказы
[{ _id: 1, items: [ { product_id: 1, price: 1.99, qty: 2 }, { product_id: 2, price: 3.99, qty: 5 } ]}]
продукты
[{ _id: 1, name: "Product 1" }, { _id: 2, name: "Product 2 }]

Ожидаемый результат:
[{ _id: 1, items: [ { product_id: 1, name: "Product 1", price: 1.99, qty: 2 }, { product_id: 2, name: "Product 2",, price: 3.99, qty: 5 } ]}]

Я попытался использовать $ lookup и pipe (mongodb 3.6) и не получить значение имени, или даже совпадение не работает.

Спасибо за помощь!

1 Ответ

0 голосов
/ 26 апреля 2018

Этот запрос поможет вам, извините, если я не использовал v3.6.

db.orders.aggregate([
{
    $unwind: "$items"
},
{
     $lookup:
       {
         from: "products",
         localField: "items.product_id",
         foreignField: "_id",
         as: "tproduct"
       }
},
{ 
    $project: 
    {
        "_id" : 1,
        "items.product_id" : 1,
        "items.name" : { $arrayElemAt: ["$tproduct.name", 0] },
        "items.price" : 1,
        "items.qty" : 1
    }
},
{
    $group : 
    { 
        _id : "$_id", 
        items: { $push: "$items" } 
    }
}
])

Это 4 этапа, которые я объясню:

  1. $ unwind создаст отдельный объект для каждого элемента в массиве.
  2. $ lookup найдет правильный продукт, имейте в виду, что Product._id должен быть уникальным.
  3. $ project отформатирует мои документы и в items.name я беру первый элемент предложения поиска.
  4. $ group будет использовать _id для группировки и добавления каждого элемента в новый массив.

Я почти уверен, что есть более понятные и простые способы написать это, но это должно работать без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...