Typowym sposobem śledzenia ogólnej liczby głosów byłoby zachowanie liczby głosów w dokumencie pocztowym i niepodzielne aktualizowanie jej podczas przesyłania nowej wartości do tablicy głosów.
Ponieważ jest to pojedyncza aktualizacja, masz gwarancję, że liczba będzie zgodna z liczbą elementów w tablicy.
Jeśli liczba agregacji jest stała, a witryna jest bardzo zajęta, możesz rozszerzyć ten paradygmat i zwiększyć dodatkowe liczniki, takie jak jeden dla miesiąca, dnia i godziny, ale może to bardzo szybko wymknąć się spod kontroli. Zamiast tego możesz użyć nowego Struktury agregacji (dostępne w wydaniu deweloperskim 2.1.2, będzie w produkcji w wersji 2.2. Jest prostsze w użyciu niż Map/Reduce i pozwoli ci wykonać obliczenia, które chcesz w bardzo prosty sposób, szczególnie jeśli zadbasz o przechowywanie dat głosowania jako Typ ISODate().
Typowy potok dla zapytania agregującego dla najczęściej zbierających głosy w tym miesiącu może wyglądać mniej więcej tak:
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}
] );
Ogranicza to wejście do potoku do postów, które mają głosy dopasowując daty głosowania do liczonego miesiąca, "odwija" tablicę, aby uzyskać jeden dokument na głos, a następnie wykonuje równoważne "grupowanie według" sumując wszystkie głosy dla każdego tytułu (Zakładam, że tytuł jest wyjątkowy). Następnie sortuje malejąco według liczby głosów i ogranicza wynik do pierwszych dziesięciu.
Masz również możliwość agregowania głosów według dnia (na przykład) dla danego miesiąca, aby zobaczyć, które dni są najbardziej aktywne w głosowaniu:
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}
] );