Article {
"_id" : "A",
"title" : "Hello World",
"user_id" : 12345,
"text" : 'My test article',
"comments" : [
{ 'text' : 'blah', 'user_id' : 654321, 'votes' : [987654]},
{ 'text' : 'foo', 'user_id' : 987654, 'votes' : [12345, 654321] },
...
]
}
Die Grundvoraussetzung hier ist, dass ich die Comments
verschachtelt habe innerhalb des Article
. Die Votes
gelten nur für einen Comment
, also wurden sie als Array mit jedem Comment
gespeichert . In diesem Fall habe ich nur die user_id gespeichert. Wenn Sie mehr Informationen speichern möchten (time_created usw.), können Sie ein Array von Objekten wählen:
... 'votes' : [ { user_id : 987654, ts : 78946513 } ] ...
So führen Sie Ihre Abfragen effizient durch:
db.articles.find( { _id : 'A' } )
Dies bekommt alles mit einer Abfrage. Möglicherweise müssen Sie eine clientseitige Logik anwenden, um die Stimmen pro Kommentar zu zählen, aber das ist ziemlich trivial.
db.articles.ensureIndex( { "comments.user_id" : 1 } )
db.articles.find( { "comments.user_id" : 987654 } ) // returns all document fields
Der Index ermöglicht eine effiziente Suche nach Kommentaren innerhalb eines Dokuments.
Es gibt derzeit keine Möglichkeit, nur die Übereinstimmungen aus einem Unterarray zu extrahieren. Diese Abfrage gibt tatsächlich alle Artikel mit Kommentaren dieses Benutzers zurück. Wenn dies möglicherweise viel zu viele Daten sind, können Sie etwas kürzen.
db.articles.find( { "comments.user_id" : 987654 }, { "title" : 1, "comments.user_id" : 1 })
db.articles.ensureIndex( { "comments.votes" : 1 } )
db.articles.find( { "comments.votes" : 987654 } )
Auch hier werden alle Artikel zurückgegeben, nicht nur die Kommentare.
Hier muss ein Kompromiss eingegangen werden. Das Zurücksenden des Artikels kann den Anschein erwecken, als würden wir zu viele Daten zurücksenden. Aber was möchten Sie dem Benutzer anzeigen, wenn Sie Abfrage Nr. 3 stellen?
Abrufen einer Liste mit "Kommentaren, für die ich gestimmt habe" ist ohne den Kommentar selbst nicht sehr nützlich. Natürlich ist der Kommentar ohne den Artikel selbst (oder zumindest nur den Titel) nicht sehr nützlich.
Meistens entwickelt sich Abfrage Nr. 3 zu einem Join von Votes
zu Comments
zu Articles
. Wenn das der Fall ist, warum bringen Sie dann nicht einfach die Artikel zurück?