mon go заменить ObjectId в массиве данными - PullRequest
0 голосов
/ 13 марта 2020

У меня есть такая модель:

{
    name: 'John Doe',
    items: [
        { count: 5, item: ObjectId('xxx1') },
        { count: 2, item: ObjectId('xxx2') }
    ]
}

items поле не является обязательным и содержит числовое поле и ссылку на другой объект. Я хотел бы заменить item внутри items массива данными из сущности следующим образом:

{
    name: 'John Doe',
    items: [
        { count: 5, item: { more: 'data', from: 'other entity' } },
        { count: 2, item: { more: 'data 2', from: 'other entity 2' } }
    ]
}

Я попытался использовать агрегат и поиск mon go:

Model.aggregate([
   {
        $lookup: {
          from: 'items',
          localField: 'users.items',
          foreignField: '_id',
          as: 'users.items'
        }
   }
]);

но это заменяет все в массиве элементов (потеря поля count). Как я могу это исправить?

1 Ответ

0 голосов
/ 13 марта 2020

Попробуйте это:

db.collection.aggregate([
   { $unwind: { path: "$items", preserveNullAndEmptyArrays: true } },
   {
      $lookup: {
         from: 'items',
         localField: 'items.item',
         foreignField: '_id',
         as: 'items.item'
      }
   },
   { $set: { "items.item": { $arrayElemAt: ["$items.item", 0] } } },
   {
      $group: {
         _id: { _id: "$_id", name: "$name" },
         items: { $push: "$$ROOT.items" }
      }
   },
   { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$_id"] } } }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...