MongoEngine Python से MongoDB के साथ काम करने के लिए एक ऑब्जेक्ट डॉक्यूमेंट मैपर (ODM) है। ODM परत किसी ऑब्जेक्ट मॉडल को किसी दस्तावेज़ डेटाबेस में मैप करती है जिस तरह से ORM किसी ऑब्जेक्ट मॉडल को रिलेशनल डेटाबेस से मैप करता है। MongoEngine जैसे ODM संबंधपरक डेटाबेस जैसी सुविधाएँ प्रदान करते हैं उदा। आवेदन स्तर पर स्कीमा प्रवर्तन, विदेशी कुंजी, क्षेत्र-स्तरीय बाधा आदि।
MongoEngine के उपयोग को सीखने के लिए यहां एक ट्यूटोरियल सहित कई अच्छे संसाधन उपलब्ध हैं।
इस पोस्ट में, हम एक MongoDB पायथन ट्यूटोरियल के रूप में इंडेक्स बनाने के लिए एक MongoEngine प्रोग्रामिंग निर्माण और इससे जुड़े प्रदर्शन ओवरहेड पर चर्चा करेंगे।
MongoEngine में स्वचालित अनुक्रमणिका निर्माण
डिफ़ॉल्ट रूप से, MongoEngine दस्तावेज़ों को एक संग्रह में संग्रहीत करता है जिसे वर्ग नाम के बहुवचन रूप के रूप में नामित किया गया है। उदाहरण के लिए, नीचे दिखाया गया उपयोगकर्ता वर्ग उपयोगकर्ता नाम के संग्रह में संग्रहीत किया जाएगा। एक मॉडल को मैप किए गए ऑब्जेक्ट बनने के लिए MongoEngine वर्ग दस्तावेज़ को इनहेरिट करना चाहिए।
class User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
ऊपर परिभाषित उपयोगकर्ता वर्ग दो इंडेक्स घोषित करता है:1. नाम (सॉर्ट ऑर्डर) और 2. ईमेल (हैशेड)। MongoEngine पहले अपरर्ट ऑपरेशन में प्रत्येक घोषित इंडेक्स बनाता है। ये इंडेक्स संग्रह पर createIndex/ensureIndex कॉल के माध्यम से बनाए जाते हैं। MongoEngine हर बार संग्रह में दस्तावेज़ डालने पर इन अनुक्रमणिकाओं को बनाने का प्रयास करता है।
उदाहरण के लिए
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
इस कॉल का परिणाम तीन . होता है डेटाबेस सर्वर के लिए आदेश अनुरोध:दो यह सुनिश्चित करने के लिए आदेश देता है कि उपयोगकर्ता संग्रह पर नाम और ईमेल अनुक्रमणिका मौजूद है, एक वास्तविक अपरर्ट करने के लिए।
COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "name_1", key: { name: 1 } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "email_hashed", key: { email: "hashed" } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms COMMAND [conn8640] command admin.user command: insert { insert: "user", ordered: true, documents: [ { name: "Ross", email: "[email protected]", address: "127, Baker Street", _id: ObjectId('584419df01f38269dd9d63c1') } ], writeConcern: { w: 1 } } ninserted:1 keyUpdates:0 writeConflicts:0 numYields:0 reslen:40 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } }, Collection: { acquireCount: { w: 1 } } } protocol:op_query 0ms
यह उन अनुप्रयोगों के लिए ठीक है जहां लेखन भार कम से मध्यम है। हालांकि, यदि आपका आवेदन लेखन-प्रधान है, तो इसका लेखन प्रदर्शन पर गंभीर प्रतिकूल प्रभाव पड़ता है।
ऑटो इंडेक्स क्रिएशन से बचना
अगर 'auto_create_index' गलत . पर सेट है मेटा-डिक्शनरी में, फिर MongoEngine इंडेक्स के स्वचालित निर्माण को छोड़ देता है। लेखन कार्यों के दौरान कोई अतिरिक्त createIndex अनुरोध नहीं भेजे जाते हैं। ऑटो इंडेक्स क्रिएशन को बंद करना प्रोडक्शन सिस्टम में भी उपयोगी होता है जहां इंडेक्स आमतौर पर डेटाबेस परिनियोजन के दौरान लागू होते हैं।
उदाहरण के लिए,
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
यदि आप एक लेखन-गहन एप्लिकेशन डिज़ाइन कर रहे हैं, तो स्कीमा डिज़ाइन चरण के दौरान अपने इंडेक्स पर निर्णय लेना और एप्लिकेशन को तैनात करने से पहले ही उन्हें तैनात करना समझ में आता है। यदि आप मौजूदा संग्रह पर अनुक्रमणिका जोड़ने की योजना बना रहे हैं, तो बेहतर होगा कि आप प्रतिकृति सेट पर अनुक्रमणिका बनाने के लिए दस्तावेज़ीकरण का पालन करें। इस दृष्टिकोण का उपयोग करते हुए, हम सर्वर को एक-एक करके नीचे लाते हैं और उन पर अनुक्रमणिका बनाते हैं।
अनुप्रयोग के भीतर अनुक्रमणिका बनाने के लिए MongoEngine create_index पद्धति का उपयोग करें:
User.create_index(keys, background=False, **kwargs)
आप बिना डाउनटाइम के 'रोलिंग फैशन' में इंडेक्स बनाने में मदद करने के लिए स्केलग्रिड यूआई का भी उपयोग कर सकते हैं। अधिक जानकारी के लिए हमारे MongoDB इंडेक्स बिल्डिंग ब्लॉग पोस्ट को देखें।