जैसे ही आप सही दिशा में जा रहे थे, आप यहां सही लाइनों के साथ सोचने लगे हैं। अपनी SQL मानसिकता को बदलना, "विशिष्ट" वास्तव में $group
लिखने का एक और तरीका है किसी भी भाषा में संचालन। इसका मतलब है कि आपके पास दो . है समूह संचालन यहां हो रहा है और, एकत्रीकरण पाइपलाइन शर्तों में, दो पाइपलाइन चरण।
कल्पना करने के लिए सरलीकृत दस्तावेज़ों के साथ:
{
"campaign_id": "A",
"campaign_name": "A",
"subscriber_id": "123"
},
{
"campaign_id": "A",
"campaign_name": "A",
"subscriber_id": "123"
},
{
"campaign_id": "A",
"campaign_name": "A",
"subscriber_id": "456"
}
इसका कारण यह है कि दिए गए "अभियान" संयोजन के लिए कुल संख्या और "विशिष्ट" संख्या क्रमशः "3" और "2" है। तो तार्किक बात यह है कि उन सभी "सब्सक्राइबर_आईडी" मानों को पहले "समूह" करें और प्रत्येक के लिए घटनाओं की गिनती रखें, फिर "पाइपलाइन", "कुल" सोचते समय प्रति "अभियान" की गणना करें और फिर "गिनें" अलग" बारंबारता एक अलग संख्या के रूप में:
db.campaigns.aggregate([
{ "$match": { "subscriber_id": { "$ne": null }}},
// Count all occurrences
{ "$group": {
"_id": {
"campaign_id": "$campaign_id",
"campaign_name": "$campaign_name",
"subscriber_id": "$subscriber_id"
},
"count": { "$sum": 1 }
}},
// Sum all occurrences and count distinct
{ "$group": {
"_id": {
"campaign_id": "$_id.campaign_id",
"campaign_name": "$_id.campaign_name"
},
"totalCount": { "$sum": "$count" },
"distinctCount": { "$sum": 1 }
}}
])
पहले "समूह" के बाद आउटपुट दस्तावेज़ इस तरह देखे जा सकते हैं:
{
"_id" : {
"campaign_id" : "A",
"campaign_name" : "A",
"subscriber_id" : "456"
},
"count" : 1
}
{
"_id" : {
"campaign_id" : "A",
"campaign_name" : "A",
"subscriber_id" : "123"
},
"count" : 2
}
तो नमूने में "तीन" दस्तावेजों से, "2" एक अलग मूल्य से संबंधित है और "1" दूसरे से संबंधित है। इसे अभी भी $sum
. के साथ जोड़ा जा सकता है कुल मिलान दस्तावेज़ प्राप्त करने के लिए जो आप निम्न चरण में करते हैं, अंतिम परिणाम के साथ:
{
"_id" : {
"campaign_id" : "A",
"campaign_name" : "A"
},
"totalCount" : 3,
"distinctCount" : 2
}
एकत्रीकरण पाइपलाइन के लिए वास्तव में एक अच्छा सादृश्य यूनिक्स पाइप है "|" ऑपरेटर, जो संचालन की "चेनिंग" की अनुमति देता है ताकि आप एक कमांड के आउटपुट को अगले के इनपुट के माध्यम से पास कर सकें, और इसी तरह। इस तरह से अपनी प्रसंस्करण आवश्यकताओं के बारे में सोचना शुरू करने से आपको एकत्रीकरण पाइपलाइन के साथ संचालन को बेहतर ढंग से समझने में मदद मिलेगी।