Обновление массива полей объекта в MongoDb - PullRequest
0 голосов
/ 08 октября 2019

В приведенном ниже упрощенном примере показана коллекция «Покупки» с двумя документами. Используя Mongoose и Express, я пытаюсь найти простой способ:

  1. Если shopId уже имеет itemId => обновить поля этого объекта
  2. Если shopId нетпусть itemId => добавить новый объект в массив

.

shopId: 1
   trolley: Array
      0: Object
         itemId: 1
         price: 10
         quantity: 2
      1: Object
         itemId: 2
         price: 25
         quantity: 4
      ...

shopId: 2
   trolley: Array
      0: Object
         itemId: 1
         price: 50
         quantity: 2
      1: Object
         itemId: 2
         price: 25
         quantity: 3
      ...

Элементы / поля, которые будут добавлены / обновлены, принимаются как объекты в req.body. Пример того, что я пробовал до сих пор, приведен ниже. Похоже, он работает для обновлений (то есть там, где itemId уже существует), но не для добавления новых элементов.

На некоторое время остановимся на этом, поэтому ищем некоторые предложения для решения.

var setModifier = { $set: {} };

for(const key of Objects.keys(req.body) ) {
   setModifer.$set['trolley.$.' + key] = req.body[key];
}

ShoppingModel.update(
   {"shopId": shopIdVar, "itemId": itemIdVar},
   setModifier,
   {upsert: true},
   (err, result) => {
      ...
   }
)

Пример необходимых результатов:

Example 1:
shopId=1, itemId=1
req.body={price: 12}

Result 1: 

shopId: 1
   trolley: Array
      0: Object
         itemId: 1
         price: 12
         quantity: 2
      1: Object
         itemId: 2
         price: 25
         quantity: 4

Example 2:
shopId=2, itemId=3
req.body={price: 100, quantity: 1}

Result 2: 

shopId: 2
   trolley: Array
      0: Object
         itemId: 1
         price: 50
         quantity: 2
      1: Object
         itemId: 2
         price: 25
         quantity: 3
      2: Object
         itemId: 3
         price: 100
         quantity: 1
...