Pour ce que ça vaut, même si 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é. Je fais ensuite une itération sur la sous-collection, je fixe la nouvelle valeur, je supprime l'ancienne et je mets à jour l'ensemble du document. C'était relativement facile. Il est vrai que je n'ai que quelques dizaines de milliers de lignes à parcourir, dont seulement quelques dizaines répondent aux critères.
J'espère quand même que cette réponse aidera quelqu'un !
Edit : Ajouté snapshot()
à la requête. Voir pourquoi dans les commentaires.
Vous devez appliquer snapshot()
au curseur avant de récupérer les documents dans la base de données. Vous ne pouvez utiliser snapshot()
avec des collections non triées.
De MongoDB 3.4, snapshot()
a été supprimée. Donc, si vous utilisez Mongo 3.4+ ,l'exemple ci-dessus devrait supprimer snapshot()
fonction.
1 votes
$rename
ne développe pas les tableaux, doc0 votes
@Alexander Azarov, des idées pour résoudre ce problème ? J'ai entendu parler de personnes qui copient dans des champs dans lesquels $rename peut aller...
0 votes
Personnellement, j'écris des scripts qui parcourent la collection et font des migrations.
0 votes
Si vous cherchez à faire cela avec des commandes de base de données : Comment renommer un champ dans un tableau avec des commandes de base de données ?