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

MongoDB Schema Design – hlasování o příspěvcích

Běžným způsobem, jak sledovat celkový počet hlasů, by bylo ponechat počet hlasů v dokumentu příspěvku a aktualizovat jej atomicky při vložení nové hodnoty do pole hlasů.

Protože se jedná o jedinou aktualizaci, máte zaručeno, že počet bude odpovídat počtu prvků v poli.

Pokud je počet agregací pevný a stránka je velmi zaneprázdněná, můžete toto paradigma rozšířit a zvýšit další čítače, například jeden pro měsíc, den a hodinu, ale to se může velmi rychle vymknout kontrole. Místo toho byste mohli použít nový Agregační rámec (dostupné ve verzi 2.1.2 pro vývojáře, bude ve výrobě ve verzi 2.2. Používání je jednodušší než Map/Reduce a umožní vám provádět výpočty, které chcete, velmi jednoduše, zejména pokud se budete starat o ukládání dat hlasování jako Typ ISODate().

Typický kanál pro agregační dotaz pro ty, kdo získávají nejvyšší hlasy tento měsíc, může vypadat nějak takto:

today = new Date();
thisMonth = new Date(today.getFullYear(),today.getMonth());
thisMonthEnd = new Date(today.getFullYear(),today.getMonth()+1);

db.posts.aggregate( [
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$unwind: "$Votes" },
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$group: { _id: "$title", votes: {$sum:1} } },
    {$sort: {"votes": -1} },
    {$limit: 10}
] );

Tím se omezí vstup do kanálu na příspěvky, které mají hlasy odpovídající datům hlasování s měsícem, který počítáte, „rozbalí“ pole, abyste získali jeden dokument za hlas, a poté provede ekvivalent „seskupit podle“ sečtením všech hlasů pro každý titul. (Předpokládám, že název je jedinečný). Poté seřadí sestupně podle počtu hlasů a omezí výstup na prvních deset.

Máte také možnost agregovat hlasy podle dnů (například) za daný měsíc, abyste viděli, které dny jsou nejaktivnější pro hlasování:

db.posts.aggregate( [
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$unwind: "$Votes" },
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$project: { "day" : { "$dayOfMonth" : "$Votes.votedate" }  } },
    {$group: { _id: "$day", votes: {$sum:1} } },
    {$sort: {"votes": -1} },
    {$limit: 10}
] );


  1. Chyba MongoDB 3.0.5:chyba při vyhledávání symbolu:nedefinovaný symbol:FIPS_mode_set

  2. Vytvořte dynamický dotaz pomocí Mongoose

  3. Uložte kolekci Mongo do formátu JSON

  4. MongoDB - Vytvořte dokument