2011-01-03 2 views
10
Blog { 
    id:"001" 
    title:"This is a test blog", 
    content:"...." 
    comments:[{title:"comment1",content:".."},{title:"comment2",content:"..."}]  
} 

commenti è un elenco interno nel blog.Come posso aggiornare/inserire oggetti nell'Elenco interno in Mongodb?

Ma come posso recuperare solo commenti1? e Come posso inserire/aggiornare un nuovo commento nel blog? Se ottengo un blog completo e inserisco/aggiorno il contenuto in Elenco commenti, quindi salva il blog completo, come risolvere isuue concomitante?

Grazie.

risposta

5

Per recuperare il documento incorporato è necessario recuperare il documento master e cercare nel documento di commenti incorporato il documento desiderato. In MongoDB non c'è modo di fare di meglio.

Per inserire/aggiornare in un documento incorporato è possibile utilizzare il sistema di query $push e $set per farlo.

+0

Grazie, ma voglio solo ottenere il comment1, e ho bisogno di ottenere tutti i commenti? Può problema di prestazioni se il conteggio commenti è grande .. –

+0

destro è per questo che non è un buon progetto per utilizzare documento incorporato con un po ' documento per crescere nel tempo. È necessario attendere la raccolta virtuale per farlo in futur – shingara

21
Blog { 
    id:"001" 
    title:"This is a test blog", 
    content:"...." 
    comments:[{title:"comment1",content:".."},{title:"comment2",content:"..."}]  
} 

Per inserire un commento, utilizzare $push:

db.blogs.update({id:"001"}, {$push:{comments:{title:"commentX",content:".."}}}); 

Per aggiornare un commento, utilizzare $set:

db.blogs.update({id:"001"}, {$set :{"comments.2": {...} }}); 
db.blogs.update({id:"001"}, {$set :{"comments.2.title": "new title" }}); 

2 è l'indice del commento data. L'uso del segno di citazione è necessario.

+1

Una risposta molto più pratica - deve essere contrassegnata come accettata –

+0

Ho un dubbio con questa soluzione, se 2 thread diversi, chiama db.blogs.update allo stesso tempo (condizione di competizione), Mongo garantirà le 2 voci dell'elenco salvato nel documento? – landrady

1

Per aggiornare un commento specifico per titolo.

È inoltre possibile aggiornare il contenuto del commento con il suo titolo.

db.blogs.update({'comments.title': 'comment1'}, 
{$set :{"comments.$.title": "new title", 'comments.$.content': 'this is content' }}); 

Se qualunque problema poi mi rispose.