Как обновить, только если мой объект имеет определенное поле

#javascript #reactjs #mongodb #mongoose

Вопрос:

У меня есть документ mongo db, подобный этому

 id: ObjectId(asdlkjjas_48@$#),
_user: 4593oawifjaslef,
country: { US: false, CA: false, MX: false, FR: false }
name: "kevin"
age: 28

 

Я получаю post-запрос от интерфейса с идентификатором объекта (необходимым для запроса этого документа), а также кодом страны

Итак, мой пользователь отправляет свой идентификатор и код страны в серверную часть, мне нужно обновить документ, соответствующий этому идентификатору, и обновить только код страны, вложенный в country .

Я пробую что-то вроде этого

 incomingNumber = await Collection.findById(numberId) // get our document by id
const code = 'US' // get our country code
collection.updateOne({_id: incomingNumber}, {$set: { country[code]: true }}) //trying to update only the field in country(object) that matches our supplied country code(ex. 'US')
 

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

1. работает ли это mongoosejs.com/docs/tutorials/findoneandupdate.html

2. Поле country является встроенным документом . Для работы со встроенными полями документа используйте точечную нотацию .

Ответ №1:

Чтобы сохранить country объект и сохранить ключи, которые не обновляются, вы можете либо использовать литералы шаблона, начиная с его мангуста, либо использовать квадратные скобки,

 Collection.updateOne({_id: objectId}, {$set: { ["country." code]: true}})
 

или

 Collection.updateOne({_id: objectId}, {$set: { `country.${code}`: true}})
 

Ответ №2:

Кто-то опубликовал ответ на несколько секунд, затем удалил, перепечатал ваш ответ, и я отдам вам должное.

Ответ заключается в

 Collection.updateOne({_id: incomingNumber}, {$set: { country: { [code]: true}}})
 

Мне в основном нужна была дополнительная фигурная скобка. Это работает для меня в этой ситуации, однако объект country теперь будет выглядеть так

 { US: true },
 

Я бы предпочел

  { US: true, FR: false, MX: false, CA: false }
 

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

1. Эй, проверьте ответ, который я написал.