sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb schemadesign för bloggar

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] },
    ...
  ]
}

Grundförutsättningen här är att jag har kapslat Comments inuti Article . Votes gäller endast en Comment , så de har lagrats som en array med varje Comment . I det här fallet har jag precis lagrat user_id. Om du vill lagra mer information (time_created, etc.), kan du rösta på en rad objekt:

... 'votes' : [ { user_id : 987654, ts : 78946513 } ] ...

Hur du utför dina frågor effektivt:

db.articles.find( { _id : 'A' } )

Detta får allt med en fråga. Du kanske måste göra lite logik på klientsidan för att räkna röster per kommentar, men det här är ganska trivialt.

db.articles.ensureIndex( { "comments.user_id" : 1 } )
db.articles.find( { "comments.user_id" : 987654 } ) // returns all document fields

Indexet gör det möjligt att effektivt söka igenom kommentarerna i ett dokument.

Det finns för närvarande inget sätt att extrahera endast matchningarna från en sub-array. Denna fråga kommer i själva verket att returnera alla artiklar med kommentarer från den användaren. Om detta potentiellt är alldeles för mycket data kan du trimma lite.

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 } )

Återigen, detta kommer att returnera alla artiklar, inte bara kommentarerna.

Det finns en avvägning att göra här. Att returnera artikeln kan verka som att vi hämtar tillbaka för mycket data. Men vad planerar du att visa för användaren när du gör fråga #3?

Få en lista med "kommentarer jag har röstat på" är inte särskilt användbart utan själva kommentaren. Naturligtvis är kommentaren inte särskilt användbar utan själva artikeln (eller åtminstone bara rubriken).

För det mesta övergår fråga #3 till en join från Votes till Comments till Articles . Om så är fallet, varför inte bara ta tillbaka artiklarna till att börja med?




  1. MongoDB fulltextsökning vs Lucene?

  2. Autentisering misslyckades när flask_pymongo användes

  3. Timeout väntar på en MongoConnection

  4. Exportera en array i csv från MongoDB