Na to, co to stojí za to, i když to zní hrozně, je řešení ve skutečnosti docela snadné. To samozřejmě závisí na tom, kolik záznamů máte. Ale tady je můj příklad:
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);
});
Iteruji přes svou sbírku, kde je pole nalezeno a kde je nalezen „nesprávný“ název. Poté iteruji podkolekci, nastavím novou hodnotu, odstraním starou a aktualizuji celý dokument. Bylo to relativně bezbolestné. Připouštím, že mám k prohledávání jen několik desítek tisíc řádků, z nichž jen několik desítek splňuje kritéria.
Přesto doufám, že tato odpověď někomu pomůže!
Edit:Přidáno snapshot()
na dotaz. Podívejte se proč v komentářích.
Musíte použít
snapshot()
na kurzor před načtením jakýchkoli dokumentů z databáze. Můžete použít pouzesnapshot()
s neskartovanými sbírkami.
Z MongoDB 3.4, snapshot()
funkce byla odstraněna. Pokud tedy používáte Mongo 3.4+ , výše uvedený příklad by měl odstranit snapshot()
funkce.