För vad det är värt, även om det låter hemskt att behöva göra, är lösningen faktiskt ganska enkel. Detta beror såklart på hur många skivor du har. Men här är mitt exempel:
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);
});
Jag itererar över min samling där arrayen hittas och "fel" namn hittas. Jag upprepar sedan undersamlingen, ställer in det nya värdet, tar bort det gamla och uppdaterar hela dokumentet. Det var relativt smärtfritt. Givetvis har jag bara några tiotusentals rader att söka igenom, av vilka bara ett par dussin uppfyller kriterierna.
Ändå hoppas jag att det här svaret hjälper någon!
Redigera:Lade till snapshot()
till frågan. Se varför i kommentarerna.
Du måste använda
snapshot()
till markören innan du hämtar några dokument från databasen. Du kan bara användasnapshot()
med odelade samlingar.
Från MongoDB 3.4, snapshot()
funktionen togs bort. Så om du använder Mongo 3.4+ bör exemplet ovan ta bort snapshot()
funktion.