वोटों की कुल संख्या को ट्रैक करने का सामान्य तरीका यह होगा कि पोस्ट दस्तावेज़ में वोटों की संख्या को बनाए रखा जाए और वोट एरे में नए मान को पुश करते समय इसे परमाणु रूप से अपडेट किया जाए।
चूंकि यह एक ही अपडेट है, इसलिए आपको गारंटी दी जाती है कि गणना सरणी में तत्वों की संख्या से मेल खाएगी।
यदि एकत्रीकरण की संख्या निश्चित है और साइट बहुत व्यस्त है तो आप इस प्रतिमान का विस्तार कर सकते हैं और अतिरिक्त काउंटरों को बढ़ा सकते हैं, जैसे महीने, दिन और घंटे के लिए एक, लेकिन यह बहुत जल्दी हाथ से निकल सकता है। तो इसके बजाय आप नए एग्रीगेशन फ्रेमवर्क का उपयोग कर सकते हैं। (2.1.2 देव रिलीज में उपलब्ध, रिलीज 2.2 में उत्पादन में होगा। मानचित्र/घटाने की तुलना में इसका उपयोग करना आसान है और यह आपको उन गणनाओं को करने की अनुमति देगा जो आप चाहते हैं, खासकर यदि आप अपनी वोट तिथियों को स्टोर करने का ख्याल रखते हैं ISODate() प्रकार।
इस महीने शीर्ष वोट पाने वालों के लिए एकत्रीकरण क्वेरी के लिए विशिष्ट पाइपलाइन कुछ इस तरह दिख सकती है:
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}
] );
यह पाइपलाइन में इनपुट को उन पोस्टों तक सीमित करता है, जिनके पास वोट की तारीखों का मिलान उस महीने से होता है, जिस महीने आप गिनती कर रहे हैं, प्रति वोट एक दस्तावेज़ प्राप्त करने के लिए सरणी को "खोलता है" और फिर प्रत्येक शीर्षक के लिए सभी वोटों के बराबर "समूह द्वारा" करता है। (मैं मान रहा हूं कि शीर्षक अद्वितीय है)। यह तब वोटों की संख्या के आधार पर घटते क्रम में क्रमबद्ध करता है और आउटपुट को पहले दस तक सीमित करता है।
आपके पास उस महीने के लिए दिन के हिसाब से वोट एकत्र करने की क्षमता भी है (उदाहरण के लिए) यह देखने के लिए कि कौन से दिन मतदान के लिए सबसे अधिक सक्रिय हैं:
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}
] );