Pour ce que ça vaut, bien que cela semble horrible à faire, la solution est en fait assez simple. Cela dépend bien sûr du nombre d'enregistrements que vous avez. Mais voici mon exemple :
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);
});
J'itère sur ma collection où le tableau est trouvé et le "mauvais" nom est trouvé. J'itère ensuite sur la sous-collection, définit la nouvelle valeur, supprime l'ancienne et met à jour l'ensemble du document. C'était relativement indolore. Certes, je n'ai que quelques dizaines de milliers de lignes à parcourir, dont seulement quelques dizaines répondent aux critères.
Néanmoins, j'espère que cette réponse aidera quelqu'un !
Edit :Ajout de snapshot()
à la requête. Découvrez pourquoi dans les commentaires.
Vous devez appliquer
snapshot()
au curseur avant de récupérer des documents de la base de données.Vous ne pouvez utiliser quesnapshot()
avec des collections non partitionnées.
Depuis MongoDB 3.4, snapshot()
fonction a été supprimée. Donc, si vous utilisez Mongo 3.4+, l'exemple ci-dessus devrait supprimer snapshot()
fonction.