sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB Schema Design - Rösta på inlägg

Det vanliga sättet att spåra antalet röster totalt sett skulle vara att behålla antalet röster i postdokumentet och att uppdatera det atomärt när man skjuter ett nytt värde till röstmatrisen.

Eftersom det är en enda uppdatering är du garanterad att antalet kommer att matcha antalet element i arrayen.

Om antalet aggregationer är fast och webbplatsen är mycket upptagen kan du utöka detta paradigm och öka ytterligare räknare, som en för månad, dag och timme, men det kan gå ur hand mycket snabbt. Så istället kan du använda det nya Aggregation Framework (tillgänglig i 2.1.2 dev release, kommer att vara i produktion i release 2.2. Det är enklare att använda än Map/Reduce och det låter dig göra de beräkningar du vill mycket enkelt, särskilt om du är noga med att lagra dina röstdatum som ISODate() typ.

En typisk pipeline för aggregeringsfråga för de som får flest röster denna månad kan se ut ungefär så här:

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

Detta begränsar input till pipelinen till inlägg som har röster genom att matcha röstdatum till månaden du räknar, "lindar av" arrayen för att få ett dokument per röst och gör sedan en "grupp efter"-ekvivalent som summerar alla röster för varje titel (Jag antar att titeln är unik). Den sorterar sedan fallande efter antal röster och begränsar resultatet till de första tio.

Du har också möjlighet att samla röster per dag (till exempel) för den månaden för att se vilka dagar som är mest aktiva för att rösta:

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. Hur man aktiverar distribuerad/klustrad cache när man använder redis med vårdatacache

  2. Skillnaden mellan count() och find().count() i MongoDB

  3. glesa index och nollvärden i mongo

  4. Skapa _id på underdokument på mongoimport --jsonArray