Колкото и да си струва, макар да звучи ужасно да трябва да се направи, решението всъщност е доста лесно. Това разбира се зависи от това колко записи имате. Но ето моят пример:
db.Setting.find({ 'Value.Tiers.0.AssetsUnderManagement': { $exists: 1 } }).snapshot().forEach(function(item)
{
for(i = 0; i != item.Value.Tiers.length; ++i)
{
item.Value.Tiers[i].Aum = item.Value.Tiers[i].AssetsUnderManagement;
delete item.Value.Tiers[i].AssetsUnderManagement;
}
db.Setting.update({_id: item._id}, item);
});
Преглеждам колекцията си, където се намира масивът и се намира "грешното" име. След това преглеждам подколекцията, задавам новата стойност, изтривам старата и актуализирам целия документ. Беше сравнително безболезнено. Разбира се, имам само няколко десетки хиляди реда за търсене, от които само няколко десетки отговарят на критериите.
Все пак се надявам този отговор да помогне на някого!
Редактиране:Добавен snapshot()
към заявката. Вижте защо в коментарите.
Трябва да приложите
snapshot()
до курсора, преди да извлечете документи от базата данни. Можете да използвате самоsnapshot()
с неразделени колекции.
От MongoDB 3.4, snapshot()
функцията беше премахната. Така че, ако използвате Mongo 3.4+, примерът по-горе трябва да премахне snapshot()
функция.