Как в MongoDB вы используете $set для обновления вложенного значения/встроенного документа?

Как в MongoDB вы используете $set для обновления вложенного значения?

Например, рассмотрим коллекцию people со следующим документом:

{
  _id: ObjectId("5a7e395e20a31e44e0e7e284"),
  name: "foo",
  address: { street: "123", town: "bar" }
}

Как обновить поле street, встроенное в документ address, с "123" на "Main Street"?


person Drew LeSueur    schedule 30.09.2010    source источник


Ответы (2)


Используя точечную нотацию:

db.people.update({ }, { $set: { "address.street": "Main Street" } })
person Niels van der Rest    schedule 30.09.2010
comment
Это работает, даже если адрес не существует? Я знаю, что $set создаст улицу, если она не существует по адресу, но каково поведение, если свойства предков не существуют? Кроме того, ваша ссылка требует авторизации. - person tleef; 15.05.2014
comment
@ Том, спасибо за предупреждение о ссылке, я ее исправил. Чтобы ответить на ваш вопрос: он создаст для вас необходимые наследственные свойства, если они не существуют. - person Niels van der Rest; 15.05.2014
comment
@ Том Да, будет. Он создаст весь объект вплоть до поля, которое вы устанавливаете. (Поздний ответ, но, надеюсь, это полезно для других, наткнувшихся на этот вопрос) - person Nepoxx; 21.03.2017
comment
Как установить одно и то же поле, если его адрес представляет собой массив. Например: { _id: ObjectId(5a7e395e20a31e44e0e7e284), имя: foo, адрес: [{ улица: 123, город: бар }] } - person prit kalra; 27.09.2018

В дополнение к ответу Нильса также проверьте «тип» вложенного значения. В моем случае это была «строка», сформированная из json. Хотя это может быть маловероятным, но убедитесь, что значение имеет правильный тип.

person user2725012    schedule 11.03.2015