MongoDB: вставить массив вложенных документов

У меня есть следующая коллекция "SaleOrderCol":

{
  _id: ObjectId('1000'),
  products: [
              { _id: ObjectId('1001'), name: 'ProdA', qty: 5},
              { _id: ObjectId('1002'), name: 'ProdB', qty: 10}
            ]
},
{
  _id: ObjectId('2000'),
  products: [
              { _id: ObjectId('2001'), name: 'ProdA', qty: 5},
              { _id: ObjectId('2002'), name: 'ProdC', qty: 10}
            ]
}

Я хочу сделать upsert, чтобы изменить имя и количество поддокументов (1002) и попробовать ниже:

SaleOrderCol.updateOne(
    { 
      "_id": ObjectId('1000'),
      "products._id": ObjectId('1002')
    },
    {
      $set : { "products": { name: 'ProdBB', qty: 15 }
    },
    { upsert: true }
)

Выдает ошибку. Как заставить его работать? Спасибо


person elvin    schedule 05.03.2019    source источник
comment
Пожалуйста, опубликуйте сообщение об ошибке.   -  person Mani    schedule 05.03.2019
comment
Я понял, что мой вопрос выше слишком упрощен, чтобы стать дубликатом (как указал Нил Ланн). В моем реальном случае у меня есть вложенный документ, находящийся в подмассиве. Однако с помощью аналогичного позиционного оператора $ подсказка я могу решить. Так что закрою это. Спасибо   -  person elvin    schedule 06.03.2019


Ответы (1)


Используйте позиционный оператор $

Например:

updateOne({ 
      "_id": ObjectId('1000'),
      "products._id": ObjectId('1002')
    },{
       $set: {"products.$.name": 'ProdBB' } // include other fields here
   });
);
person jakemingolla    schedule 05.03.2019
comment
Да, это работает. Спасибо jakemingolia. - person elvin; 06.03.2019