2011-04-13 5 views
40

J'ai cette collection:MongoDB: Mise à jour de sous-document

[{ "_id" : 7, 
    "category" : "Festival", 
    "comments" : [ 
     { 
       "_id" : ObjectId("4da4e7d1590295d4eb81c0c7"), 
       "usr" : "Mila", 
       "txt" : "This is a comment", 
       "date" : "4/12/11" 
     } 
    ] 
}] 

Tout ce que je veux est de pousser insérer un nouveau champ à l'intérieur des commentaires comme celui-ci:

[{ "_id" : 7, 
    "category" : "Festival", 
    "comments" : [ 
     { 
       "_id" : ObjectId("4da4e7d1590295d4eb81c0c7"), 
       "usr" : "Mila", 
       "txt" : "This is a comment", 
       "date" : "4/12/11", 
       "type": "abc" // find the parent doc with id=7 & insert this inside comments 
     } 
    ] 
}] 

Comment puis-je insérer dans le commentaire sous-document?

Répondre

73

Vous devez utiliser the $ positional operator

Par exemple:

update({ 
     _id: 7, 
     "comments._id": ObjectId("4da4e7d1590295d4eb81c0c7") 
    },{ 
     $set: {"comments.$.type": abc} 
    }, false, true 
); 

Je n'ai pas testé mais j'espère que ce sera utile pour vous.

Si vous souhaitez modifier la structure du document que vous devez utiliser

db.collection.update (critères, objNew, upsert, multi)

Arguments:

criteria - query which selects the record to update; 
objNew - updated object or $ operators (e.g., $inc) which manipulate the object 
upsert - if this should be an "upsert"; that is, if the record does not exist, nsert it 
multi - if all documents matching criteria should be updated 

et insérez new objNew avec une nouvelle structure. check this for more details

+1

ne fonctionne pas. le champ pourrait ne pas exister – kheya

+0

Je l'ai eu fonctionnant. thx – kheya

+1

Cela ne fonctionne pas pour moi. il met juste à jour un élément à l'intérieur du tableau, pas tous. même si je suis passé vrai pour plusieurs –

3

L'opérateur $ positionnel ne fonctionnera que si le champ 'comments' n'est PAS un tableau. Le json de l'OP est mal formé, mais il semble que ce soit un tableau.

Le problème est que mongodb ne mettra à jour que le premier élément d'un tableau qui correspond à la requête. Bien qu'il existe un RFE ouvert pour ajouter le support pour la mise à jour de tous les éléments du tableau: https://jira.mongodb.org/browse/SERVER-1243

Pour contourner ce problème avec les tableaux, il suffit de faire une recherche régulière puis de mettre à jour les éléments dans le tableau individuellement.

Questions connexes