sql >> Databáze >  >> NoSQL >> MongoDB

návrh schématu mongodb pro blogy

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

Základním předpokladem je, že jsem vnořil Comments uvnitř Article . Votes platí pouze pro Comment , takže byly uloženy jako pole s každým Comment . V tomto případě jsem právě uložil user_id. Pokud chcete uložit více informací (time_created atd.), můžete hlasovat pro řadu objektů:

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

Jak efektivně provádět dotazy:

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

Tím získáte vše jedním dotazem. Možná budete muset udělat nějakou logiku na straně klienta, abyste mohli počítat hlasy za komentář, ale to je docela triviální.

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

Index umožní efektivně vyhledávat komentáře v dokumentu.

V současné době neexistuje způsob, jak extrahovat pouze shody z dílčího pole. Tento dotaz ve skutečnosti vrátí všechny články s komentáři daného uživatele. Pokud je to potenciálně příliš mnoho dat, můžete provést nějaké oříznutí.

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

Opět se tím vrátí všechny články, nejen komentáře.

Tady je třeba udělat kompromis. Vrácení článku se může zdát, že vracíme příliš mnoho dat. Ale co hodláte zobrazit uživateli, když zadáte dotaz č. 3?

Získávám seznam „komentářů, pro které jsem hlasoval“ není příliš užitečné bez komentáře samotného. Komentář samozřejmě není příliš užitečný bez samotného článku (nebo alespoň jen názvu).

Dotaz č. 3 se většinou změní na spojení z Votes na Comments na Articles . Pokud je to tak, tak proč pro začátek nepřinést zpět Články?




  1. Jaké jsou základní datové struktury používané pro Redis?

  2. Jak najít mongo dokumenty se stejným polem

  3. Proměnné vysílání se nezobrazují uvnitř oddílu Apache Spark

  4. MurmurHash - co to je?