Co to jest warte, choć wydaje się to okropne, że trzeba to zrobić, rozwiązanie jest w rzeczywistości całkiem proste. To oczywiście zależy od tego, ile masz rekordów. Ale oto mój przykład:
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);
});
Iteruję po mojej kolekcji, w której znajduje się tablica i znaleziono „niewłaściwą” nazwę. Następnie przechodzę przez kolekcję podrzędną, ustawiam nową wartość, usuwam starą i aktualizuję cały dokument. To było stosunkowo bezbolesne. To prawda, że mam do przeszukania tylko kilkadziesiąt tysięcy wierszy, z których tylko kilkadziesiąt spełnia kryteria.
Mimo to mam nadzieję, że ta odpowiedź komuś pomoże!
Edycja:dodano snapshot()
do zapytania. Zobacz dlaczego w komentarzach.
Musisz zastosować snapshot()
do kursora przed pobraniem jakichkolwiek dokumentów z bazy danych. Możesz użyć tylko snapshot()
z niesharded kolekcjami.
Z MongoDB 3.4, snapshot()
funkcja została usunięta. Więc jeśli używasz Mongo 3.4+ , powyższy przykład powinien usunąć snapshot()
funkcja.