Обновление документа MongoDB с помощью подстановочного знака в имени поля

#mongodb

#mongodb

Вопрос:

У вас есть довольно глубоко вложенный документ, часть вложенности включает объект, представляющий собой хэш идентификаторов объектов, и соответствующий объект. Мне нужно обновить все документы в коллекции, обновив только одно значение во вложенном объекте. Итак, я знаю, что если бы у меня была такая структура, как:

 { 
  "name" : "Bob",
  "address" : {
     "street" : "123 Baker St"
  }
}
  

Я мог бы обновить все значения «street» с помощью следующей команды оболочки:

 db.mycollection.update({}, {$set : {"address.street" : "124 Baker St"}}, {multi: true});
  

Но в моем случае структура не так проста, в ней есть эти UUID, и я хочу обновить все. Структура больше похожа на эту:

 {
  "name": "Bob",
  "addresses" : {
     "0934029572035702834234092834" : {
         "street" : "123 Baker St"
      },
     "0904958304959879873876862378" : {
         "street" : "123 Baker St"
      }
   }
}
  

ХОРОШО < не очень хороший пример b / c в реальном мире вы бы не хотели менять эти адреса на одинаковые, но предположим на мгновение, что я это делаю. Как мне заставить все документы изменять все значения «street» во вложенном объекте «addresses» без необходимости делать это OID по OID?

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

1. Это действительно ваша структура документа? Я бы настоятельно рекомендовал изменить его, когда это возможно. Я бы ожидал чего-то вроде: { «name: «Bob», «addresses»: [ { «type»: «your strange guid like thingy», «street»: «123 Baker St»}, { type: «your 2nd guid thingy», «street»: «123 Baker St»}]} Таким образом, вы можете обновить элементы массива. Вы сокращаете структуру, вызывая команду обновления типа «addresses.yourguidthingy.street»: «новая улица» вместо обновления элемента массива типа «addresses.street»: «новая улица». Надеюсь, это немного понятно…

2. Как я уже сказал, это немного надуманный пример (на самом деле я не занимаюсь адресами), но да, вложенный документ использует ключ GUID и значение объекта для каждого элемента в родительском вложенном документе. Возможно, лучшим примером является то, что они представляют моментальные снимки данных, но я столкнулся с ситуацией, когда в истории снимков должно быть обновлено свойство для всех снимков.

Ответ №1:

Я полагаю, вы знаете UUID : P Это не массив, а вложенная структура документа, которая приходит к команде обновления, например:

 db.mycollection.update({}, {$set : {"addresses.0934029572035702834234092834.street" : "124 Baker St"}}, {multi: true});