आप यहां कुछ अलग तरीकों का इस्तेमाल कर सकते हैं:
-
मानचित्र का प्रयोग करें/कम करें:ऐसा न करें। अभी इस उपयोग के मामले के लिए मानचित्र कम करने वाले फ़ंक्शन का उपयोग करने की तुलना में एकत्रीकरण ढांचे को 3 बार चलाना बहुत तेज़ होगा।
-
3 बार एकत्रीकरण चलाएँ। यह इष्टतम नहीं है, लेकिन यदि आपके पास समय की कमी नहीं है तो यह सबसे आसान विकल्प है। अगर आपके एकत्रीकरण में वैसे भी <कुछ सेकंड लग रहे हैं तो मैं तब तक अनुकूलन के बारे में चिंता नहीं करूंगा जब तक कि वे समस्या न बन जाएं।
-
यहां सबसे अच्छा कामकाज है जिसके बारे में मैं सोच सकता हूं।
$group
ऑपरेटर आपको एक_id
बनाने की अनुमति देता है कई क्षेत्रों पर। उदा.{"_id":{"a":"$key1", "b":"$key2", "c":"$key3"}}
. ऐसा करने से आपकी विभिन्न चाबियों के सभी मौजूदा संयोजनों के लिए एक समूह तैयार होता है। आप संभावित रूप से अपनी चाबियों को इस तरह समूहित कर सकते हैं और फिर क्लाइंट में परिणामों को मैन्युअल रूप से जोड़ सकते हैं।
मुझे विस्तृत करने दो। मान लीजिए कि हमारे पास आकृतियों का संग्रह है। इन आकृतियों में एक रंग, एक आकार और एक प्रकार (वर्ग, वृत्त, आदि) हो सकता है। एक बहु-कुंजी आईडी पर एकत्रीकरण ऐसा दिखाई दे सकता है:
db.shapes.aggregate({$group:{_id:{"f1":"$f1", "f2":"$f2", "f3":"$f3"}, count:{"$sum":1}}})
और वापसी:
"result" : [
{
"_id" : {
"f1" : "yellow",
"f2" : "medium",
"f3" : "triangle"
},
"count" : 4086
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4138
},
{
"_id" : {
"f1" : "red",
"f2" : "big",
"f3" : "square"
},
"count" : 4113
},
{
"_id" : {
"f1" : "yellow",
"f2" : "small",
"f3" : "triangle"
},
"count" : 4145
},
{
"_id" : {
"f1" : "red",
"f2" : "small",
"f3" : "square"
},
"count" : 4062
}
... और इसी तरह
फिर आप प्रविष्टियों की काफी कम संख्या में, क्लाइंट-साइड परिणामों का योग करेंगे। यह मानते हुए कि दस्तावेजों की कुल संख्या की तुलना में प्रत्येक कुंजी के लिए अद्वितीय मानों की संख्या पर्याप्त रूप से कम है, आप इस अंतिम चरण को नगण्य समय में कर सकते हैं।