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

Kommentare ist eine innere Liste im Blog.Wie kann ich ein Objekt in die innere Liste in Mongodb aktualisieren/einfügen?

Aber wie kann ich nur Kommentar1 abrufen? und Wie kann ich einen neuen Kommentar in den Blog einfügen/aktualisieren? Wenn ich einen vollständigen Blog bekomme und den Inhalt in die Kommentarliste einfüge/aktualisiere, dann speichere den vollständigen Blog, wie man gleichzeitig ituue löst?

Danke.

Antwort

5

Um das eingebettete Dokument zu holen, müssen Sie das Masterdokument holen und in seinem eingebetteten Dokument das gewünschte Dokument suchen. In MongoDB gibt es eigentlich keinen besseren Weg.

Zum Einfügen/Aktualisieren in einem eingebetteten Dokument können Sie das Abfragesystem $push und $set verwenden, um dies zu tun.

+0

Danke, aber ich möchte nur den Kommentar1, und ich brauche alle Kommentare? Es kann Leistung, wenn die Kommentare zählen ist groß .. –

+0

Sie Recht, es ist nicht ein gutes Design, um eingebettete Dokumente mit einigen zu verwenden Dokument in der Zeit wachsen. Sie müssen warten, die virtuelle Sammlung, dass in Zukunft tun – shingara

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

Kommentar einzufügen, verwenden $push:

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

einen Kommentar zu aktualisieren, verwenden Sie $set:

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

2 der Index des gegebenen Kommentar. Die Verwendung von Anführungszeichen ist notwendig.

+1

Eine viel praktischere Antwort - sollte als akzeptiert markiert werden –

+0

Ich habe einen Zweifel, mit dieser Lösung, wenn 2 verschiedene Threads, db.blogs.update zur gleichen Zeit (Race-Bedingung), Wird Mongo die 2 Punkte der im Dokument gespeicherten Liste sicherstellen? – landrady

1

Um einen bestimmten Kommentar nach Titel zu aktualisieren.

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

Sie können den Inhalt des Kommentars auch mit dem Titel aktualisieren.

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

Wenn irgendein Problem dann antworte mir.

Verwandte Themen