#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});