2013-08-29 7 views
16

मैं एकाधिक भुगतान स्रोतों का उपयोग करने वाले खातों की पहचान करने के लिए एकत्रीकरण लिखने की कोशिश कर रहा हूं। विशिष्ट डेटा होगा।MongoDB एकत्रीकरण: विशिष्ट फ़ील्ड की गणना

{ 
account:"abc", 
vendor:"amazon", 
} 
... 
{ 
account:"abc", 
vendor:"overstock", 
} 

अब, मैं मैं कैसे मोंगो के एकत्रीकरण ढांचे में इस बारे में है कि इस

{ 
account:"abc", 
vendorCount:2 
} 

के समान खातों की एक सूची बनाना चाहें,

उत्तर

46

मैं $ का उपयोग करके यह पता लगा addToSet और $ ऑपरेटरों को खोलें।

Mongodb Aggregation count array/set size

db.collection.aggregate([ 
{ 
    $group: { _id: { account: '$account' }, vendors: { $addToSet: '$vendor'} } 
}, 
{ 
    $unwind:"$vendors" 
}, 
{ 
    $group: { _id: "$_id", vendorCount: { $sum:1} } 
} 
]); 

आशा है कि यह किसी को मदद मिलती है

+0

इस का उपयोग सेट जहां सेट के सौहार्द काफी छोटा है के लिए काम कर सकते हैं कर सकते हैं, लेकिन बड़ा डेटा परिदृश्यों के लिए इस काम नहीं करेगा (यदि कल्पना आपके पास सैकड़ों हजार अद्वितीय विक्रेता थे)। –

+3

यह उत्तर बड़ा डेटा परिदृश्य हल करता है: http://stackoverflow.com/a/24770233/139721 – anushr

+0

क्या यह फिर से '$ विक्रेताओं' को फिर से वापस जाना आवश्यक है? यह तथ्य दिया गया है कि हम विक्रेताओं की गिनती को 'results.get ("विक्रेताओं") द्वारा गणना कर सकते हैं। आकार(); ' –

14

मुझे लगता है कि इसके बेहतर अगर आप निष्पादित क्वेरी जिसके बाद से बचने जाएगा खोलना

db.t2.insert({_id:1,account:"abc",vendor:"amazon"}); 
db.t2.insert({_id:2,account:"abc",vendor:"overstock"}); 


db.t2.aggregate(
{ $group : { _id : { "account" : "$account", "vendor" : "$vendor" }, number : { $sum : 1 } } }, 
{ $group : { _id : "$_id.account", number : { $sum : 1 } } } 
); 

कौन आपको बताएंगे कि जो उम्मीद है परिणाम निम्नलिखित की तरह ।

{ "_id" : "abc", "number" : 2 } 
5

मैं नहीं दिख रहा है यही कारण है कि किसी को $ समूह दो बार

db.t2.aggregate([ { $group: {"_id":"$account" , "number":{$sum:1}} } ]) 

उपयोग करने के लिए यह बिल्कुल ठीक काम करेंगे होगा।

+0

मुझे लगता है क्योंकि वे कुंजी और सुधार का नाम बदलना चाहते थे। लेकिन यह वास्तव में, बहुत बेहतर और बहुत प्रभावी है। – c24b

+9

मुझे लगता है कि वे 'अद्वितीय' गिनती की तलाश में थे। – user1700890

-4

एक उदाहरण

db.collection.distinct("example.item").forEach(function(docs) { 
    print(docs + "==>>" + db.collection.count({"example.item":docs})) 
}); 
+1

आपको वर्णन के लिए एक विवरण प्रदान करना चाहिए * क्यों * यह प्रश्न के समाधान के रूप में काम करता है। उदाहरण कोड को उसी डेटा और वैरिएबल संदर्भ को वास्तविक प्रश्न के रूप में उपयोग करने के लिए यह बहुत उपयोगी है। यह जवाब StackOverflow पर "कम गुणवत्ता" माना जाएगा; निम्न गुणवत्ता वाले उत्तरों डाउनवॉट को आकर्षित करते हैं, और आपको किसी और प्रश्न का उत्तर देने से प्रतिबंधित कर सकते हैं। –

0

आप sets

db.test.aggregate([ 
    {$group: { 
     _id: "$account", 
     uniqueVendors: {$addToSet: "$vendor"} 
    }}, 
    {$project: { 
     _id: 1, 
     vendorsCount: {$size: "$uniqueVendors"} 
    }} 
]); 
संबंधित मुद्दे