MongoDB можно ли обновить только часть документа?

У меня есть это:

//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

Надеюсь, все понятно, я хочу сказать MongoDB обновить только измененные поля в объекте в документе, а не заменять весь объект.

Raz Buchnik 03.01.2019 14:41

Почему вместо "address.street" стоит "personal_info.address.street"?

mickl 03.01.2019 18:19

@mickl Ошибка. Отредактировано.

Raz Buchnik 04.01.2019 13:43
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
0
3
712
1

Ответы 1

Вы обновляете документ, используя другой путь

Ваше обновление генерирует адрес первого уровня без работы с нужным полем.

На основе вашего 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 есть собственный встроенный парсер? Это мой вопрос.

Raz Buchnik 04.01.2019 13:45

Кстати, с вашим последним ответом я немного запутался в вашей проблеме. Я думаю, вы усугубляете проблему. Написание собственного парсера кажется ИМО преувеличенным решением. Это просто обновление документа, и если ваш корень можно изменить, возможно, вам нужно оформить документ по-другому.

MetalMad 04.01.2019 21:32

Я просто хочу отправить объект с ключом A и сказать MongoDB обновить только ключ A, а не заменять весь объект.

Raz Buchnik 05.01.2019 19:57

Другие вопросы по теме