У меня есть это:
//users collection:
{
personal_info: {
first_name: "John",
address: {
city: "New york",
street: "A"
}
}
}
Следующее обновление хочу сделать вот так:
req.body = {
"address.street": "B"
}
db.users.update({}, {$set: req.body}, err => {
...
});
Как видите, я беру весь документ и прошу mongo обновить только то, что изменилось в наборе.
Это возможно?
Вместо этого Mongo берет весь документ, заменяет его и устанавливает новый документ:
{
personal_info: {
first_name: "John",
address: {
street: "B"
}
}
} // notice that "address.city" is gone
Почему вместо "address.street" стоит "personal_info.address.street"?
@mickl Ошибка. Отредактировано.

Вы обновляете документ, используя другой путь
Ваше обновление генерирует адрес первого уровня без работы с нужным полем.
На основе вашего req.body
db.users.update({}, {$set: req.body}
обновляет такой документ
{
"_id" : ObjectId("5c2e4872e44cfe4170bc1565"),
"personal_info" : {
"first_name" : "John",
"address" : {
"city" : "New york",
"street" : "A"
}
},
"address" : {
"street" : "B"
}
}
так как ваш адрес находится внутри поля personal_info
Для того, чтобы делать то, что вы хотите, вы должны правильно указать root.
db.sample.update({}, {$set: {"personal_info.address.street" : "B"}})
Правильный корень можно изменить. Это когда пользователь обновляет ресурс, не все поля обязательны. Я могу сделать парсер его запроса самостоятельно, но это утомительно и, может быть, в MongoDB есть собственный встроенный парсер? Это мой вопрос.
Кстати, с вашим последним ответом я немного запутался в вашей проблеме. Я думаю, вы усугубляете проблему. Написание собственного парсера кажется ИМО преувеличенным решением. Это просто обновление документа, и если ваш корень можно изменить, возможно, вам нужно оформить документ по-другому.
Я просто хочу отправить объект с ключом A и сказать MongoDB обновить только ключ A, а не заменять весь объект.
Надеюсь, все понятно, я хочу сказать MongoDB обновить только измененные поля в объекте в документе, а не заменять весь объект.