MongoDB: aggiornamento del documento secondario

Ho questa collezione:

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

Tutto quello che voglio è inserire un nuovo campo all’interno di commenti come questo:

 [{ "_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 } ] }] 

Come posso inserire all’interno del documento secondario dei commenti?

È necessario utilizzare l’operatore posizionale $

Per esempio:

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

Non l’ho provato ma spero che ti sarà utile.

Se si desidera modificare la struttura del documento che è necessario utilizzare

db.collection.update (criteri, objNew, upsert, multi)

Argomenti:

 criteria - query which selects the record to update; objNew - updated object or $ operators (eg, $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 

e inserisci nuovo objNew con una nuova struttura. controllare questo per maggiori dettagli

L’operatore $ posizionale funzionerà come previsto solo se il campo ‘commenti’ NON è un array. Il json dell’OP è malformato, ma sembra che potrebbe essere un array.

Il problema è che adesso mongodb aggiornerà solo il primo elemento di un array che corrisponde alla query. Sebbene sia disponibile un RFE per aggiungere il supporto per l’aggiornamento di tutti gli elementi dell’array corrispondenti: https://jira.mongodb.org/browse/SERVER-1243

Per ovviare a questo problema con gli array, è sufficiente eseguire una ricerca regolare, quindi aggiornare gli elementi nell’array singolarmente.