मेरे पास एक माँगोडब संग्रह है जो ऐसा कुछ दिखता है:
db.scores.insert ({"नाम": "बॉब", मूल्य: 96.3, टाइमस्टैम्प: '2010- 9-27 9:32:00'}) db.scores.insert ({"नाम": "जॉन", मान: 98.3, टाइमस्टैम्प : '2010- 9-27 9:28:00'}) db.scores.insert ({"नाम": "बॉब", मूल्य: 99.3, टाइमस्टैम्प: '2010- 9-27 9:29:00'}) Db.scores.insert ({"name": "John", मान: 97.3, टाइमस्टैम्प: '2010- 9-27 9:31:00'})
मैं कैसे पूछ सकता हूं यह मुझे एक बार, सबसे हाल के मूल्य के साथ मुझे देने के लिए:
{नाम: "जॉन", मान: 97.3} {नाम: "बॉब", मूल्य: 96.3}
आप डेटा एकत्रीकरण करने की कोशिश कर रहे हैं, इसलिए आपको एक लिखना होगा।
मानचित्रण
नक्शा फ़ंक्शन मूल रूप से ग्रुप BY
से SQL से खंड है आपके मामले में हम नाम पर समूह करेंगे, इसलिए हम नाम को कुंजी
के रूप में उपयोग करेंगे। मान
में अन्य डेटा की आवश्यकता होगी, इस मामले में मूल्य और टाइमस्टैम्प।
map = function () {emit (this.name, {timeStamp: This.timeStamp, मान: this.value}); }
नक्शा समारोह के परिणामस्वरूप प्रत्येक कुंजी के लिए मानों की एक सरणी हो जाएगी। इसलिए "बॉब" नाम के सभी दस्तावेजों को कुंजी "बॉब" में मैप किया गया है। आपके नमूना डेटा के लिए, परिणाम इस तरह दिख सकता है:
{_id: "Bob", मान: [{टाइमस्टैम्प: "2010- 9-27 9:32:00", मान: 96.3}, {टाइमस्टैम्प: "2010- 9-27 9: 29,00", मूल्य: 99.3}]}, {_id: "John", मान: [{टाइमस्टैम्प: "2010- 9-27 9:28:00 ", मान: 98.3}, {टाइमस्टैम्प:" 2010- 9-27 9:31:00 ", मूल्य: 97.3}]},
कम करना
कम करने के लिए कार्य एक कुंजी के लिए प्रत्येक कुंजी के मानों की सरणी को कम करने के लिए जिम्मेदार है। आपके मामले में, हम केवल उच्चतम टाइमस्टैम्प के साथ डेटा में दिलचस्पी रखते हैं:
कम करें = कार्य (कुंजी, मान) {var maxData = {timeStamp: नई तिथि (0)}; Values.for प्रत्येक (कार्य (डेटा) {if (data.timeStamp & gt; maxData.timeStamp) {maxData = data;}}); वापसी अधिकतमडेटा; }
ध्यान दें कि यह महत्त्वपूर्ण है कि फ़ंक्शन कम करने का रिटर्न वैल्यू उसी प्रारूप के रूप में मान है जो इसे स्वीकार करता है। यह इस तथ्य के कारण है कि समारोह को कम करने के लिए एकल कुंजी के लिए कई बार कहा जा सकता है, हर बार कुल मानों का केवल एक खंड स्वीकार कर लिया जा सकता है।
कार्य को कम करने के चलते निम्न में परिणाम होगा:
{_id: "Bob", मान: {timeStamp: "2010-9-27 9:32:00", मान: 96.3}}, {_id: "John", मान: {timeStamp : "2010- 9-27 9:31:00", मूल्य: 97.3}}
को अंतिम रूप देना
अंतिम रूप देने वाला फ़ंक्शन केवल डेटा को निकालने के लिए उपयोग किया जा सकता है जरूरत है, जो कि मूल्य है।
अंतिम रूप = समारोह (कुंजी, मान) {return value.value; }
इसका परिणाम निम्न होगा:
{"_id": "Bob", "value": 96.3}, {"_id": "John "मूल्य": 97.3}
चलने वाला नक्शा-कम करें
आप इन फ़ंक्शंस से नक्शा घटा सकते हैं:
res = db.scores.mapReduce (नक्शा, कम करें, {अंतिम रूप: अंतिम रूप}};
संग्रह डीबी [res.result]
में क्वेरी का परिणाम होगा।
एक अंतिम समस्या
समारोह को कम करने के रूप में टाइमस्टैंप की तुलना करता है अपने नमूना कोड से देखते हुए, आपने दिनांक वस्तुओं या पूर्णांक टाइमस्टैम्प के बजाय टाइमस्टैम्प को स्ट्रिंग के रूप में संग्रहीत किया है। तो इससे पहले कि आप तिथियों की तुलना कर सकें, आपको इन तारों को तिथि ऑब्जेक्ट में बदलना होगा।
Comments
Post a Comment