उत्पादन कोड में Mongoose अनुक्रमण


124

प्रति और / के लिए मानगो दस्तावेज प्रति :MongooseJSMongoDBNode.js

जब आपका एप्लिकेशन शुरू होता है, तो Mongoose स्वचालित रूप ensureIndexसे आपके स्कीमा में प्रत्येक परिभाषित सूचकांक के लिए कॉल करता है । विकास के लिए अच्छा है, यह अनुशंसा की जाती है कि यह व्यवहार उत्पादन में अक्षम हो क्योंकि सूचकांक निर्माण एक महत्वपूर्ण प्रदर्शन प्रभाव पैदा कर सकता है। autoIndexअपने स्कीमा के विकल्प को गलत पर सेट करके व्यवहार को अक्षम करें ।

यह मोंगो से ऑटो-इंडेक्सिंग को हटाने के निर्देश देने से पहले दिखाई देता है, जो मोंगो को जाने से रोकने के लिए नियुक्त करने के लिए मोंगो को जाने के लिए और एप्लिकेशन स्टार्टअप पर सभी इंडेक्स के माध्यम से मंथन करने के लिए, जो समझ में आता है।

उत्पादन कोड में अनुक्रमण को संभालने का उचित तरीका क्या है? हो सकता है कि एक बाहरी स्क्रिप्ट इंडेक्स उत्पन्न करे? या हो सकता है ensureIndexकि अनावश्यक है अगर एक एकल संग्रह के लिए एक एकल पाठक / लेखक है क्योंकि यह हर बार एक डीबी लिखने के बाद एक सूचकांक जारी रखेगा?

संपादित करें: पूरक करने के लिए, MongoDB अनुक्रमण करने के तरीके के लिए अच्छा प्रलेखन प्रदान करता है , लेकिन ऐसा क्यों नहीं या जब स्पष्ट अनुक्रमण निर्देश किया जाना चाहिए। मुझे ऐसा लगता है कि इंडेक्स एप्लिकेशन को वर्तमान अनुक्रमित के साथ संग्रह पर स्वचालित रूप से लेखक अनुप्रयोगों द्वारा अद्यतित रखा जाना चाहिए और यह वास्तव में एक बार की चीज से अधिक है (जब एक नया इंडेक्स लागू किया जा रहा है), जिस स्थिति में मोंगो का होना चाहिए सामान्य सर्वर पुनरारंभ के तहत नो-ऑप।ensureIndexautoIndex

जवाबों:


135

मैं कभी नहीं समझ पाया कि इतने व्यापक रूप autoIndexसे उत्पादन में अक्षम होने की सिफारिश मोंगोज़ दस्तावेज क्यों करता है । एक बार इंडेक्स जोड़ने के बाद, बाद की ensureIndexकॉलों में बस यह देखा जाएगा कि इंडेक्स पहले से मौजूद है और फिर वापस आ जाए। इसलिए यह केवल प्रदर्शन पर प्रभाव डालता है जब आप पहली बार सूचकांक बना रहे होते हैं, और उस समय संग्रह अक्सर खाली होते हैं इसलिए सूचकांक बनाना वैसे भी जल्दी होगा।

मेरा सुझाव autoIndexसक्षम छोड़ना है जब तक कि आपके पास एक विशिष्ट स्थिति नहीं है जहां यह आपको परेशानी दे रहा है; जैसे यदि आप किसी मौजूदा संग्रह में एक नया सूचकांक जोड़ना चाहते हैं जिसमें लाखों डॉक्स हैं और इसे बनाते समय आप अधिक नियंत्रण चाहते हैं।


10
मुझे जोड़ने के लिए एक प्रश्न है ... क्या होगा अगर मैं इसे गलत सेट करूँ? जब मैं डेटा सम्मिलित करूंगा या उसे स्पष्ट रूप से बनाने की आवश्यकता होगी, तो इंडेक्स बनाए जाएंगे। मुझे खेद है कि अगर यह एक नौसिखिया सवाल है, लेकिन यदि आप उत्तर देते हैं तो यह वास्तव में उपयोगी होगा।
शरण मोहपात्रा

5
@SaranshMohapatra जब autoIndexझूठा होता है, तो आपको इसके सूचकांक बनाने के लिए अपने मॉडल पर सुनिश्चित करें कि आपको कॉल करना होगा
जॉनीएचके

क्या मुझे हर बार या केवल एक बार मॉडल को परिभाषित करने के लिए इसे कॉल करना होगा?
सरसंघ महापात्र

जब आप अपने मॉडल को परिभाषित (संकलित) करते हैं तो @SanshMohapatra। मैं ऐसा तब करता हूं जब मैं पहली बार ऐप शुरू करता हूं। यदि आप स्कीमा में बदलाव करते हैं तो अब कठिन विचार सभी इंडेक्सों को छोड़ने और उन्हें फिर से बनाने का निर्णय लेना है।
मॉस

3
@ जॉनीएचके क्या आप अभी भी अपने जवाब से सहमत हैं कि यह लगभग 2016 है?
अलेक्जेंडर मिल्स

41

हालाँकि मैं स्वीकृत उत्तर से सहमत हूँ, लेकिन यह ध्यान देने योग्य है कि MongoDB मैनुअल के अनुसार , यह उत्पादन सर्वर पर अनुक्रमित जोड़ने का अनुशंसित तरीका नहीं है:

यदि आपके एप्लिकेशन में EnsIndex () संचालन शामिल है, और एक सूचकांक अन्य परिचालन चिंताओं के लिए मौजूद नहीं है, तो सूचकांक के निर्माण से डेटाबेस के प्रदर्शन पर गंभीर प्रभाव पड़ सकता है।

प्रदर्शन के मुद्दों से बचने के लिए, सुनिश्चित करें कि गेटइंडेक्स () विधि या आपके ड्राइवर के लिए समतुल्य विधि का उपयोग करके आपके एप्लिकेशन इंडेक्स की जांच करते हैं और उचित इंडेक्स मौजूद नहीं होने पर समाप्त कर देते हैं। हमेशा निर्दिष्ट रखरखाव विंडो के दौरान, अलग-अलग एप्लिकेशन कोड का उपयोग करके उत्पादन उदाहरणों में अनुक्रमणिका बनाएं।

बेशक, यह वास्तव में इस बात पर निर्भर करता है कि आपका आवेदन कैसे संरचित और तैनात किया गया है। उदाहरण के लिए, यदि आप हरोकू में तैनात हैं, और आप हेरोकू का उपयोग नहीं कर रहे हैं प्रीबूट सुविधा , तो संभावना है कि आपका एप्लिकेशन स्टार्टअप के दौरान अनुरोधों की सेवा नहीं दे रहा है, और इसलिए उस समय एक इंडेक्स बनाना संभवतः सुरक्षित है।

इसके अतिरिक्त, स्वीकृत उत्तर से:

इसलिए यह केवल प्रदर्शन पर प्रभाव डालता है जब आप पहली बार सूचकांक बना रहे होते हैं, और उस समय संग्रह अक्सर खाली होते हैं इसलिए सूचकांक बनाना वैसे भी जल्दी होगा।

यदि आप अपने डेटा मॉडल और प्रश्नों को पहली बार में प्राप्त करने में कामयाब रहे हैं, तो यह ठीक है, और अक्सर मामला है। हालांकि, यदि आप अपने ऐप में नई कार्यक्षमता जोड़ रहे हैं, तो एक इंडेक्स के बिना एक संपत्ति पर एक नई डीबी क्वेरी के साथ, आप अक्सर कई मौजूदा दस्तावेजों वाले संग्रह में एक इंडेक्स जोड़कर खुद को पाएंगे।

यह वह समय है जब आपको अनुक्रमणिका जोड़ने के बारे में सावधानी बरतने की आवश्यकता होती है, और ऐसा करने के प्रदर्शन निहितार्थ पर ध्यान से विचार करें। उदाहरण के लिए, आप पृष्ठभूमि में सूचकांक बना सकते हैं :

db.ensureIndex({ name: 1 }, { background: true });

3
ठीक है, तो आपको बस इतना करना है कि अपने सर्वर को तब तक शुरू न करें जब तक कि सभी संग्रह के लिए सुनिश्चित नहीं किया जाए।
अलेक्जेंडर मिल्स

@AlexMills आप यह कैसे सुनिश्चित करते हैं?
अकेला

async.each (Object.keys (मॉडल), फंक्शन (की, cb) {मॉडल [key] .ensureIndexes (cb)}, cb)
अलेक्जेंडर मिल्स

बस प्रत्येक मोंगोज़ मॉडल पर सुनिश्चित करेंइंडेक्स कॉल करें, सभी को समाप्त करने के लिए प्रतीक्षा करें, फिर अपना सर्वर शुरू करें; मैं आपके सर्वर के शुरू होने से पहले db कनेक्शन की प्रतीक्षा करने की भी सलाह देता हूं
अलेक्जेंडर मिल्स

2
कोई है ensureIndexअब। नहीं है createIndexबजाय। क्या मैं सही हू?
जैक

1

उत्पादन मोड को संभालने के लिए इस ब्लॉक कोड का उपयोग करें:

const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.