Схема складов:

{_id: 1, name: 'A'}
{_id: 2, name: 'B'}
{_id: 3, name: 'C'}

Схема акций:

{_id: 11, productId: 1, instock: [{warehouse: 'A', qty: 20}, {warehouse: 'B', qty: 5}, {warehouse: 'C', qty: 8}]
{_id: 12, productId: 2, instock: [{warehouse: 'A', qty: 30}]

Я новичок в MongoDB, но хотел бы иметь по одной строке для каждой записи, чтобы отображать доступное количество продуктов на каждом из складов A, B, C:

Желаемый вывод массива:

instock: [
           {_id: 11, productId: 1, warehouse: 'A', qty: 20},
           {_id: 11, productId: 1, warehouse: 'B', qty: 5},
           {_id: 11, productId: 1, warehouse: 'C', qty: 8},
           {_id: 12, productId: 2, warehouse: 'A', qty: 30},
           {_id: 12, productId: 2, warehouse: 'B', qty: 0},
           {_id: 12, productId: 2, warehouse: 'C', qty: 0}
]

Я читал о $ lookup, $ unwind, $ project и пробовал что-то вроде ниже, но не где-то рядом с тем, что я хочу:

    Warehouse.aggregate([
    {
      $lookup:
      {
        from: "stocks",
        pipeline: [ 
          { $project: { _id: 0, instock: {qty: 1, warehouse: 1} }},  
          { $replaceRoot: { newRoot: { newStock : '$instock' } } } 
        ],
        as: "instock"
      }
    } ,
 ]);

Привет, Энтони Уинслет, ваш совет частично работает, например:

{_id: 12, productId: 2, instock: [{warehouse: 'A', qty: 30}]

Из вашего решения: Отображение результатов только для склада A:

[{_id: 12, productId: 2, warehouse: 'A', qty: 30}] 

Могу ли я получить и на склад B & C? (по умолчанию qty равно 0, если не определено)

[{_id: 12, productId: 2, warehouse: 'A', qty: 30},
 {_id: 12, productId: 2, warehouse: 'B', qty: 0},
 {_id: 12, productId: 2, warehouse: 'C', qty: 0}]

Не уверен, что это возможно ... спасибо

1
elvin 14 Окт 2018 в 18:53

1 ответ

Лучший ответ

Решение от Энтони Винзлета:

Warehouse.aggregate([
  { "$unwind": "$instock" },
  { "$replaceRoot": { "newRoot": { "$mergeObjects": ["$$ROOT", "$instock"] } }},
  { "$project": { "instock": 0 } }
])
0
Ashh 16 Окт 2018 в 15:58