sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB Schema Design - Afstemning på indlæg

Den almindelige måde at spore det samlede antal stemmer på ville være at beholde antallet af stemmer i postdokumentet og at opdatere det atomært, når der skubbes en ny værdi til stemmerækken.

Da det er en enkelt opdatering, er du garanteret, at antallet vil matche antallet af elementer i arrayet.

Hvis antallet af sammenlægninger er fast, og webstedet er meget travlt, kan du udvide dette paradigme og øge yderligere tællere, f.eks. en for måned, dag og time, men det kan meget hurtigt komme ud af hånden. Så i stedet kan du bruge det nye Aggregation Framework (tilgængelig i 2.1.2 dev-udgivelse, vil være i produktion i release 2.2. Det er enklere at bruge end Map/Reduce, og det vil give dig mulighed for at lave de beregninger, du ønsker meget enkelt, især hvis du sørger for at gemme dine stemmedatoer som ISODate() type.

Typisk pipeline for aggregeringsforespørgsler for topstemmefangere denne måned kan se nogenlunde sådan ud:

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

Dette begrænser input til pipelinen til indlæg, der har stemmer ved at matche stemmedatoer til den måned, du tæller, "afvikler" arrayet for at få ét dokument pr. stemme og laver derefter en "gruppe efter"-ækvivalent, der opsummerer alle stemmer for hver titel (Jeg går ud fra, at titlen er unik). Den sorterer derefter faldende efter antal stemmer og begrænser outputtet til de første ti.

Du har også mulighed for at samle stemmer efter dag (for eksempel) for den måned for at se, hvilke dage der er mest aktive til at stemme:

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. Mongomapper dokumentation?

  2. mongodb nodejs - konvertering af cirkulær struktur

  3. mongodb forbindelse timeout fejl

  4. Node.js og MongoDB, genbrug af DB-objektet