2017-07-24 1 views
0

Je commence par mongoDB et je veux mettre à jour un tableau imbriqué dans mes documents pour ajouter une valeur initiale, mais je ne peux pas trouver un moyen de le faire avec mongo.MongoDB: Ajouter un champ dans chaque élément du tableau

ici est mon document:

{ 
"_id":"cTZDL7WThChSvsvBT", 
"name":"abc", 
"players":[ 
    { 
    "playerName":"Name1" 
    }, 
    { 
    "playerName":"Name2" 
    } 
] 
} 

Ce que je veux faire:

{ 
"_id":"cTZDL7WThChSvsvBT", 
"name":"abc", 
"players":[ 
    { 
    "playerName":"Name1", 
    "NewField1":0, 
    "NewField2":0 
    }, 
    { 
    "playerName":"Name2", 
    "NewField1":0, 
    "NewField2":0 
    } 
] 
} 

Quelqu'un at-il une solution pour ce genre de situation?

Répondre

0

considérant que vous souhaitez mettre à jour un élément qui est un objet aussi,

que diriez-vous?

db.collections.updateOne({_id: "cTZDL7WThChSvsvBT"}, {$set: {"players.0.NewField1": 0, "players.0.NewField2: 0}}); 
+0

fonctionne bien, mais seulement pour le premier « joueur ». Je ne connais pas la taille du tableau et j'ai besoin d'ajouter les valeurs à chacun d'entre eux. – Etienne

+0

je pense que c'est semblable à ce cas, https://stackoverflow.com/questions/4669178/how-to-update-multiple-array-elements-in-mongodb –

0

Cela ajoute les nouveaux champs au tableau player ...

db.collection.update({_id: 'cTZDL7WThChSvsvBT', players: {$exists: true}}, {$set: {'players.$.NewFieldOne': 0, 'players.$.NewFieldTwo': 0}}) 

... mais depuis Mongo will only update the first element of an array which matches the query vous êtes un peu bourré. Vous pouvez, bien sûr, choisir quel élément de tableau mettre à jour en utilisant l'opérateur positionnel (comme dans mon exemple) ou en choisissant un élément spécifique (comme l'affiche précédente suggérée) mais jusqu'à ce que Mongo prenne en charge les mises à jour de tous les éléments. Il vous reste une solution telle que: trouver les documents pertinents et ensuite les mettre à jour (c.-à-d. une solution de mise à jour côté client).

+0

Merci pour votre solution, fonctionne! Et merci aussi pour l'explication de fond. – Etienne

0

J'ai finalement trouvé un moyen en modifiant directement le document dans JS comme ceci:

db.doc.find({_id: myDocId}).forEach(function (channel) { 
    channel.players.forEach(function (player) { 
     player.newField1 = 0; 
     player.newField2 = 0; 

    }); 
    db.doc.update({_id: myDocId}, channel); 
    });