Per quello che vale, anche se sembra orribile da fare, la soluzione è in realtà piuttosto semplice. Questo ovviamente dipende da quanti record hai. Ma ecco il mio esempio:
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);
});
Eseguo un'iterazione sulla mia raccolta in cui si trova l'array e viene trovato il nome "sbagliato". Quindi ripeto sulla raccolta secondaria, imposto il nuovo valore, elimino il vecchio e aggiorno l'intero documento. Era relativamente indolore. Certo, ho solo poche decine di migliaia di righe da cercare, di cui solo poche decine soddisfano i criteri.
Tuttavia, spero che questa risposta aiuti qualcuno!
Modifica:aggiunto snapshot()
alla domanda. Scopri perché nei commenti.
Devi applicare snapshot()
al cursore prima di recuperare qualsiasi documento dal database. Puoi usare solo snapshot()
con raccolte non ripartite.
Da MongoDB 3.4, snapshot()
la funzione è stata rimossa. Quindi, se si utilizza Mongo 3.4+ , l'esempio sopra dovrebbe rimuovere snapshot()
funzione.