2013-02-28 15 views
7

में पूरे दस्तावेज़ का संदर्भ देने से मैं '$' ऑपरेटर का उपयोग करके मोंगो डीबी एकत्रीकरण पाइपलाइन में विशेषताओं के व्यक्तिगत मानों के मानों का संदर्भ दे सकता हूं। लेकिन, मैं पूरे दस्तावेज़ (संदर्भ) का उपयोग कैसे करूं?मोंगोडीबी एकत्रीकरण पाइपलाइन


अद्यतन: परिदृश्य समझाने के लिए प्रदान की एक उदाहरण।

यहां एक उदाहरण है जो मैं करने की कोशिश कर रहा हूं। मेरे पास ट्वीट्स का संग्रह है। और प्रत्येक ट्वीट में एक सदस्य 'क्लस्टर' होता है, जो कि एक विशेष ट्वीट से संबंधित क्लस्टर का संकेत है।

{ 
    "_id" : "5803519429097792069", 
    "text" : "The following vehicles/owners have been prosecuted by issuing notice on the basis of photographs on dated... http://t.co/iic1Nn85W5", 
    "oldestts" : "2013-02-28 16:11:32.0", 
    "firstTweetTime" : "4 hours ", 
    "id" : "307161122191065089", 
    "isLoc" : true, 
    "powertweet" : true, 
    "city" : "new+delhi", 
    "latestts" : "2013-02-28 16:35:05.0", 
    "no" : 0, 
    "ts" : 1362081807.9693, 
    "clusters" : [ 
     { 
      "participationCoeff" : 1, 
      "clusterID" : "5803519429097792069" 
     } 
    ], 
    "username" : "dtptraffic", 
    "verbSet" : [ 
     "date", 
     "follow", 
     "prosecute", 
     "have", 
     "be" 
    ], 
    "timestamp" : "4 hours ", 
    "entitySet" : [ ], 
    "subCats" : { 
     "Generic" : [ ] 
    }, 
    "lang" : "en", 
    "fns" : 18.35967, 
    "url" : "url|109|131|http://fb.me/2CeaI7Vtr", 
    "cat" : [ 
     "Generic" 
    ], 
    "order" : 7 
} 

के बाद से, वहाँ मेरे संग्रह में सौ हजारों ट्वीट्स की कुछ जोड़े हैं, मैं 'clusters.clusterID' द्वारा सभी ट्वीट्स समूह करना चाहते हैं। असल में, मैं निम्नलिखित की तरह एक प्रश्न लिखना चाहते हैं:

db.tweets.aggregate (
{ $group : { _id : '$clusters.clusterID', 'members' : {$addToSet : <????> } } } 
) 

मैं वर्तमान में प्रसंस्करण दस्तावेज़ तक पहुँच और इसे संदर्भ जहां मैं ऊपर क्वेरी में डाल दिया है करना चाहते हैं। क्या कोई जानता है कि यह कैसे करें?

+1

आप आपको बस इतना करना कोशिश कर रहे हैं का एक उदाहरण है? – RickyA

+1

संक्षेप में - नहीं, ऐसा करने का कोई तरीका नहीं है (यदि आप सभी प्रमुख नामों को जानते थे, लेकिन यह सहायक होने की संभावना नहीं है)। –

+0

यदि आप मूल दस्तावेज़ के फ़ील्ड के निश्चित सेट के लिए बसने के इच्छुक हैं तो आप एजीजी फ्रेमवर्क में ऐसा कर सकते हैं। –

उत्तर

-1

मुझे लगता है कि इस कार्य के लिए MapReduce अधिक उपयोगी है।

जैसा कि अस्या कामस्की की टिप्पणियों में लिखा गया है, मेरा उदाहरण मोंगोडब के लिए गलत है, कृपया official docs का उपयोग mongoDB के लिए करें।

+0

आप सही हैं कि नक्शा/कम कर सकते हैं यह कर सकते हैं, लेकिन जो आपने यहां दिया है वह काम नहीं करेगा। आपका नक्शा थोड़ा गलत है, और आपका कम फ़ंक्शन पूरी तरह से गायब प्रतीत होता है। –

+0

यह नहीं है कि नक्शा/काम कैसे कम करता है। आपके कम फ़ंक्शन को उसी प्रारूप को वापस करना होगा जो आपका मानचित्र फ़ंक्शन उत्सर्जित करता है, और इसे एक से अधिक बार भी कहा जा सकता है। आपके परीक्षण ने कुछ छोटे परीक्षण सेट के लिए "दाएं" दिखने वाले उत्तर दिए होंगे, लेकिन यह वास्तविक डेटा पर सही ढंग से काम नहीं करेगा। –

+1

mapReduce के लिए दस्तावेज़ पृष्ठ देखें। http://docs.mongodb.org/manual/reference/method/db.collection।mapReduce/# आवश्यकताएँ-कम-कम-फ़ंक्शन दोनों तथ्यों को सूचीबद्ध करता है (साथ ही तथ्य यह है कि कम करने के लिए मैप कुंजी के लिए बिल्कुल नहीं कहा जाएगा जो केवल एक बार होता है) –

2

वर्तमान में एकत्रीकरण ढांचे में पूर्ण दस्तावेज़ तक पहुंचने का कोई तंत्र नहीं है, यदि आप केवल क्षेत्रों का एक सबसेट की जरूरत है, तुम कर सकते हो:

db.tweets.aggregate([ {$group: { _id: '$clusters.clusterID', 
            members: {$addToSet : 
             { user: "$user", 
             text: "$text", // etc for subset 
                 // of fields you want 
             } 
            } 
           } 
         } ]) 

में कुछ लाख ट्वीट्स साथ मत भूलना, योग पूरा दस्तावेज़ आपको लौटाए गए समेकन ढांचे के परिणाम दस्तावेज़ के लिए 16 एमबी सीमा में चलाएगा। प्रलेखन मैंने पाया कि $$ROOT अभिव्यक्ति इस समस्या के पते में

var m = function() { 
    emit(this.clusters.clustersID, {members:[this]}); 
} 

var r = function(k,v) { 
    res = {members: [ ] }; 
    v.forEach(function (val) { 
    res.members = val.members.concat(res.members); 
    }); 
    return res; 
} 

db.tweets.mapReduce(m, r, {out:"output"}); 
+0

मेरे पास एक ही समस्या थी और बैटस्क्रैम ने निम्नलिखित समाधान की पेशकश की। http://stackoverflow.com/questions/34404834/how-to-group-and-select-document-corresponding-to-max-within-each-group-in-mongo?noredirect=1#comment56552218_34404834। उन्होंने $$ ROOT – user1700890

+0

$$ रूट के माध्यम से पूर्ण दस्तावेज़ तक पहुंचने का सुझाव दिया 2.6 में प्रस्तुत किया गया था और इस प्रश्न/उत्तर के समय उपलब्ध नहीं था। https://jira.mongodb.org/browse/SERVER-9840 –

9

:

आप इस तरह MapReduce के माध्यम से ऐसा कर सकते हैं।

डॉक्टर से: http://docs.mongodb.org/manual/reference/operator/aggregation/group/#group-documents-by-author

+1

इस सवाल से पूछा गया था कि MongoDB 2.2 चालू था - $ 2.6 रूट संस्करण 2.6 (2014 की शुरुआत में) –

+1

में जोड़ा गया था शायद आप [मेरा यह सवाल] जवाब दे सकते हैं (http://stackoverflow.com/questions/39288087/mongodb-collection-with-different-language-texts-select-localized-texts)। समस्या यह है कि मैं दस्तावेज़ को स्वयं प्राप्त करना चाहता हूं, उप-दस्तावेज के रूप में नहीं, '{$ समूह: $$ ROOT} 'जो कि संभव नहीं है, और इस पल के लिए यह केवल उप-दस्तावेज़ के रूप में हो सकता है:' {$ समूह: {_id: '$$ ROOT'}} ' – Miquel

+0

पहले प्रक्षेपण का उपयोग करते समय यह कार्य कैसे करें? – Dane411

संबंधित मुद्दे