MongoDB ने हाल ही में अपनी नई एकत्रीकरण संरचना पेश की है। यह संरचना कम किए गए मानचित्र के साथ शक्तिशाली संरचनाओं पर निर्भर होने के बजाय समेकित मानों की गणना के लिए एक आसान समाधान प्रदान करती है।
केवल कुछ सरल आदिम के साथ, यह आपको किसी विशेष MongoDB संग्रह में निहित दस्तावेज़ों की गणना, समूह, आकार और डिज़ाइन करने की अनुमति देता है। इस लेख के शेष भाग में नए MongoDB एकत्रीकरण प्लेटफॉर्म के इष्टतम उपयोग के लिए मैप रिडक्शन एल्गोरिदम की रीफैक्टरिंग का वर्णन किया गया है। संपूर्ण स्रोत कोड सार्वजनिक रूप से उपलब्ध Datablend GitHub रिपॉजिटरी में पाया जा सकता है।
<एच2>1. MongoDB एकत्रीकरण संरचनामोंगोडीबी एग्रीगेशन प्लेटफॉर्म प्रसिद्ध लिनक्स पाइपलाइन अवधारणा पर आधारित है जहां एक कमांड का आउटपुट एक कन्वेयर के माध्यम से प्रेषित किया जाता है या अगले कमांड के लिए इनपुट के रूप में उपयोग करने के लिए रीडायरेक्ट किया जाता है . MongoDB के मामले में कई ऑपरेटरों को एक एकल कन्वेयर में जोड़ा जाता है जो दस्तावेज़ प्रवाह को संसाधित करने के लिए जिम्मेदार होता है।
कुछ ऑपरेटर जैसे $ मिलान, $ सीमा और $ दस्तावेज़ को इनपुट के रूप में स्वीकार करना छोड़ देते हैं और एक निश्चित मानदंड के पूरा होने पर उसी दस्तावेज़ को आउटपुट करते हैं। अन्य ऑपरेटर, जैसे $ प्रोजेक्ट और $ खोलना, एक दस्तावेज़ को इनपुट डेटा के रूप में स्वीकार करते हैं और इसके प्रारूप को बदलते हैं या एक निश्चित प्रक्षेपण के आधार पर कई दस्तावेज़ बनाते हैं।
$ समूह ऑपरेटर अंततः कई दस्तावेज़ों को इनपुट डेटा के रूप में स्वीकार करता है और उन्हें संबंधित मानों को मिलाकर एक दस्तावेज़ में समूहित करता है। इनमें से कुछ ऑपरेटरों में नए मानों की गणना करने या स्ट्रिंग संचालन करने के लिए अभिव्यक्तियों का उपयोग किया जा सकता है।
कई ऑपरेटरों को एक ही पाइपलाइन में जोड़ा जाता है, जो दस्तावेजों की सूची पर लागू होता है। कन्वेयर को स्वयं MongoDB कमांड के रूप में निष्पादित किया जाता है, जिसके परिणामस्वरूप एक MongoDB दस्तावेज़ होता है, जिसमें कन्वेयर के अंत में निकले सभी दस्तावेज़ों की एक सरणी होती है। अगला पैराग्राफ ऑपरेटरों के कन्वेयर के रूप में आणविक समानता के रिफैक्टरिंग एल्गोरिदम का विस्तार से वर्णन करता है। कार्यान्वयन तर्क को पूरी तरह से समझने के लिए पिछले दो लेखों को (पुनः) अवश्य पढ़ें।
2. आणविक समानता की पाइपिंग
किसी विशेष संग्रह के लिए एक कन्वेयर लागू करते समय, उस संग्रह में निहित सभी दस्तावेज़ पहले ऑपरेटर को इनपुट के रूप में पास कर दिए जाते हैं। यह अनुशंसा की जाती है कि आप पाइपलाइन के माध्यम से स्थानांतरित किए जाने वाले दस्तावेज़ों की संख्या को सीमित करने के लिए जितनी जल्दी हो सके इस सूची को फ़िल्टर करें। हमारे मामले में, इसका मतलब पूरे दस्तावेज़ को फ़िल्टर करना है जो कभी भी लक्ष्य टैनिमोटो कारक को पूरा नहीं करेगा।
इसलिए, पहले चरण के रूप में, हम उन सभी दस्तावेज़ों की तुलना करते हैं जिनके लिए फ़िंगरप्रिंट की संख्या एक निश्चित सीमा के भीतर है। यदि हम 0.8 के टैनिमोटो कारक को लक्षित करते हैं जिसमें 40 अद्वितीय फ़िंगरप्रिंट वाले लक्ष्य कनेक्शन होते हैं, तो $ मैच ऑपरेटर इस तरह दिखेगा:
<ब्लॉकक्वॉट>
{"$match" :
{ "fingerprint_count" : {"$gte" : 32, "$lte" : 50}}.
}
केवल 32 से 50 तक के कई फ़िंगरप्रिंट वाले कनेक्शन अगले पाइपलाइन ऑपरेटर को स्थानांतरित किए जाएंगे। इस फ़िल्टरिंग को करने के लिए, $ मिलान ऑपरेटर उस इंडेक्स का उपयोग कर सकता है जिसे हमने फिंगरप्रिंट_काउंट प्रॉपर्टी के लिए परिभाषित किया था। टैनिमोटो गुणांक की गणना करने के लिए हमें एक निश्चित इनपुट कनेक्शन और हमारे द्वारा लक्षित लक्ष्य कनेक्शन के बीच सामान्य फिंगरप्रिंट की संख्या की गणना करने की आवश्यकता है।
फिंगरप्रिंट स्तर पर काम करने के लिए, हम $ unwind ऑपरेटर का उपयोग करते हैं। $ खोलना सरणी तत्वों को एक-एक करके हटाता है, दस्तावेज़ स्ट्रीम लौटाता है जिसमें निर्दिष्ट सरणी को इसके तत्वों में से एक द्वारा प्रतिस्थापित किया जाता है। हमारे मामले में, हम उंगलियों के निशान के लिए $ खोलना लागू करते हैं। नतीजतन, प्रत्येक संयुक्त दस्तावेज़ के परिणामस्वरूप n समग्र दस्तावेज़ होंगे, जहाँ n समग्र दस्तावेज़ में निहित अद्वितीय फ़िंगरप्रिंट की संख्या है।
<ब्लॉकक्वॉट>
{"$unwind" :"$fingerprints"}
सामान्य फ़िंगरप्रिंट की संख्या की गणना करने के लिए, हम उन सभी दस्तावेज़ों को फ़िल्टर करके प्रारंभ करेंगे जिनमें फ़िंगरप्रिंट नहीं हैं जो लक्ष्य कनेक्शन की फ़िंगरप्रिंट सूची में हैं। ऐसा करने के लिए, हम फिर से $ मिलान ऑपरेटर का उपयोग करते हैं, इस बार फ़िंगरप्रिंट संपत्ति को फ़िल्टर करना, जहाँ केवल फ़िंगरप्रिंट वाले दस्तावेज़ समर्थित हैं जो लक्ष्य फ़िंगरप्रिंट सूची में हैं।
<ब्लॉकक्वॉट>
{"$match" :
{ "fingerprints" :
{"$in" : [ 1960 , 15111 , 5186 , 5371 , 756 , 1015 , 1018 , 338 , 325 , 776 , 3900 , ..., 2473] }
}
}
चूंकि हम केवल उन फ़िंगरप्रिंट से मेल खाते हैं जो लक्षित फ़िंगरप्रिंट सूची में हैं, आउटपुट का उपयोग सामान्य फ़िंगरप्रिंट की कुल संख्या की गणना करने के लिए किया जा सकता है।
ऐसा करने के लिए हम समग्र कनेक्शन के लिए $ समूह ऑपरेटर को लागू करते हैं, हालांकि हम एक नए प्रकार के दस्तावेज़ बनाते हैं जिसमें मिलान करने वाले फ़िंगरप्रिंट की संख्या (घटनाओं की संख्या को जोड़कर), इनपुट कनेक्शन फ़िंगरप्रिंट की कुल संख्या और स्माइली शामिल हैं।पी> <ब्लॉकक्वॉट>
{"$group" :
{ "_id" : "$compound_cid". ,
"fingerprintmatches" : {"$sum" : 1} ,
"totalcount" : { "$first" : "$fingerprint_count"} ,
"smiles" : {"$first" : "$smiles"}
}
}
अब हमारे पास टैनिमोटो गुणांक की गणना करने के लिए सभी पैरामीटर हैं। ऐसा करने के लिए, हम $ प्रोजेक्ट ऑपरेटर का उपयोग करेंगे, जो आईडी और मुस्कान मिश्रित संपत्ति की प्रतिलिपि बनाने के अलावा, टैनिमोटो नामक एक नई गणना की गई संपत्ति भी जोड़ता है।
<ब्लॉकक्वॉट>
{
"$project"
:
{
"_id"
:
1
,
"tanimoto"
:
{
"$divide"
:
[
"$fingerprintmatches."
,
{
"$subtract"
:
[
{
"$add"
:
[
40
,
"$totalcount"
]
}
,
"$fingerprintmatches."
]
}
]
}
,
"smiles"
:
1
}
}
चूंकि हम केवल उन कनेक्शनों में रुचि रखते हैं जिनका टैनिमोटो लक्ष्य गुणांक 0.8 है, हम वैकल्पिक $ मैच ऑपरेटर का उपयोग उन सभी को फ़िल्टर करने के लिए करते हैं जो इस गुणांक तक नहीं पहुंचते हैं।
<ब्लॉकक्वॉट>
{"$match" :
{ "tanimoto" : { "$gte" : 0.8}
}
पूरी पाइपलाइन का कमांड नीचे पाया जा सकता है।
<ब्लॉकक्वॉट>
{"aggregate" : "compounds"} ,
"pipeline" : [
{"$match" :
{ "fingerprint_count" : {"$gte" : 32, "$lte" : 50} }
},
{"$unwind" : "$fingerprints"},
{"$match" :
{ "fingerprints" :
{"$in" : [ 1960 , 15111 , 5186 , 5371 , 756 , 1015 , 1018 , 338 , 325 , 776 , 3900,... , 2473] }
}
},
{"$group" :
{ "_id" : "$compound_cid" ,
"fingerprintmatches" : {"$sum" : 1} ,
"totalcount" : { "$first" : "$fingerprint_count"} ,
"smiles" : {"$first" : "$smiles"}
}
},
{"$project" :
{ "_id" : 1 ,
"tanimoto" : {"$divide" : ["$fingerprintmatches"] , { "$subtract" : [ { "$add" : [ 89 , "$totalcount"]} , "$fingerprintmatches"] }. ] } ,
"smiles" : 1
}
},
{"$match" :
{"tanimoto" : {"$gte" : 0.05} }
} ]
}
इस पाइपलाइन के आउटपुट में कनेक्शन की एक सूची है जिसमें किसी विशेष लक्ष्य कनेक्शन के संबंध में टैनिमोटो 0.8 या उच्चतर है। इस कन्वेयर का एक दृश्य प्रतिनिधित्व नीचे पाया जा सकता है:
3. निष्कर्ष
नई MongoDB एकत्रीकरण संरचना उपयोग में आसान ऑपरेटरों का एक सेट प्रदान करती है जो उपयोगकर्ताओं को कार्ड कमी प्रकार के एल्गोरिदम को अधिक संक्षेप में व्यक्त करने की अनुमति देती है। इसके नीचे एक कन्वेयर की अवधारणा डेटा को संसाधित करने का एक सहज तरीका प्रदान करती है।
आश्चर्य की बात नहीं है, इस पाइपलाइन प्रतिमान को विभिन्न नोएसक्यूएल दृष्टिकोणों द्वारा अपनाया गया है, जिसमें कार्यान्वयन में ग्रेमलिन फ्रेमवर्क टिंकरपॉप और कार्यान्वयन में साइफर नियो4j शामिल हैं।
प्रदर्शन के संदर्भ में, पाइपिंग समाधान कमी मानचित्रों के कार्यान्वयन में एक महत्वपूर्ण सुधार है।
ऑपरेटरों को शुरू में मोंगोडीबी प्लेटफॉर्म द्वारा समर्थित किया जाता है, जो व्याख्या किए गए जावास्क्रिप्ट पर महत्वपूर्ण प्रदर्शन सुधार की ओर जाता है। चूंकि एग्रीगेशन फ्रेमवर्क एक अलग वातावरण में भी काम कर सकता है, यह आसानी से मेरे मूल कार्यान्वयन के प्रदर्शन को पार कर जाता है, खासकर जब इनपुट कनेक्शन की संख्या अधिक होती है और टैनिमोटो लक्ष्य कम होता है। MongoDB कमांड से उत्कृष्ट प्रदर्शन!