Как обновить и объединить данные вложенного документа в MongoDB?

#javascript #mongodb

Вопрос:

Я только начал изучать внутреннюю разработку. И я создаю демонстрационное приложение. У меня есть коллекция с документом, который выглядит так:

 {
  "_id":"6083801e4b59bb38eeb9f232",
  "sets":4,
  "reps":"4-6",
  "name":"deadlift",
  "description":null,
  "instructions":[
    "keep feet sholder width apart",
    "use legs first and then move to lower back"
  ]
}
 

Теперь я создаю API для обновления документа следующим образом:

 db.collection('exercises').updateOne({ _id }, { $set: update })
 

где _id-это значение идентификатора, и update это объект JS с обновленными значениями, который выглядит следующим образом:

 {
  "_id":"608380294b59bb38eeb9f233",
  "description":[
    "Second day - Legs 2"
  ],
  "instructions":[
    "More reps, less weight",
    "keep feet shoulder-width apart",
    "use legs first and then move to lower back",
    "Keep at least 2 reps in the tank"
  ],
  "reps":"6-8",
  "sets":4,
  "addNew":true
}
 

Я хочу объединить существующие данные об упражнениях с обновленными. Но мой запрос не работает. Одним из способов может быть get получение данных об упражнениях по идентификатору, а затем их объединение вручную. А затем отправьте новые данные в качестве обновления. Но мне было интересно, есть ли изящный способ решить эту проблему. Как и в моем решении, мне придется сделать 2 сетевых вызова, и я не думаю, что это хороший способ решить эту проблему. Имейте в виду, что update это может быть любое поле, это может быть только одно поле, это может быть несколько полей. Это также может быть вложенный объект.

Комментарии:

1. но вы можете просто обновить mongoplayground.net/p/qWG2SrJGwi6

2. @varman означает ли это, что мне нужно передать объект с именем update $set ? Как показывает номер строки в вашем примере, вы передаете update объект? Как объединить существующие значения с объектом? Нужно ли мне извлечь существующий документ, объединить его и затем выполнить запрос на обновление? Извините, если это очевидный вопрос, но я немного новичок в Монго.

3. Вы также можете обновить корневой документ, но оба они разные _id , поэтому вам нужно быть осторожным при переопределении существующих полей mongoplayground.net/p/eT6i7yECRTV

4. нет, мне не нужно обновлять поле идентификатора, я просто скопировал полезную нагрузку запроса от почтальона. Идентификатор всегда остается одним и тем же. но остальные поля будут/могут быть обновлены. Я отправляю идентификатор из полезной нагрузки, так как таким образом я буду знать, какой документ в коллекции мне нужно обновить. FE отправит только обновленную часть. BE позаботится о слиянии существующих и новых данных.

5. надеюсь, это решит вашу проблему