2016-01-26 4 views
16

में मौजूद है या नहीं, क्या कोई ऐसा आदेश है जिसे मैं mongo shell में जावास्क्रिप्ट के माध्यम से उपयोग कर सकता हूं जिसका उपयोग यह जांचने के लिए किया जा सकता है कि मेरे मैंगोडब में विशेष अनुक्रमणिका मौजूद है या नहीं। मैं एक स्क्रिप्ट फ़ाइल बना रहा हूं जो इंडेक्स बनायेगा। मुझे यह अच्छा लगेगा कि अगर मैं इस फ़ाइल को कई बार चलाता हूं तो इंडेक्स जो पहले से मौजूद हैं, पुनर्निर्मित नहीं हैं।जांच कर रहा है कि कोई इंडेक्स mongodb

मैं अपने डीबी में सभी इंडेक्स का संग्रह प्राप्त करने के लिए db.collection.getIndexes() का उपयोग कर सकता हूं और फिर उन लोगों को अनदेखा करने के लिए तर्क बना सकता हूं जो पहले से मौजूद हैं लेकिन मैं सोच रहा था कि कोई अनुक्रमणिका प्राप्त करने के लिए आदेश है या नहीं और फिर एक स्क्रिप्ट को अनदेखा करें जो अनुक्रमणिका बनाता है।

If !exists(db.collection.exists("indexname")) 
{ 
    create db.collectionName.CreateIndex("IndexName") 
} 
+4

जोड़ने 'createIndex' कॉलिंग जब सूचकांक पहले से मौजूद है नो-सेशन है, इसलिए वहाँ वास्तव में जांच करने के लिए आवश्यकता नहीं है। – JohnnyHK

+1

संभावित डुप्लिकेट [सुनिश्चित करें कि मैन्गोड में सुनिश्चित करें] (http://stackoverflow.com/questions/12547526/ensureindex-in-mongodb) – BatScream

उत्तर

25

मोंगोडीबी में इंडेक्स बनाना एक बेवकूफ ऑपरेशन है। तो db.names.createIndex({name:1}) चलाना केवल अनुक्रमणिका बनायेगा यदि यह पहले से मौजूद नहीं था।

createIndex()ensureIndex है के लिए हटा दिया (MongoDB 3.0) के रूप में अन्य नाम() जो क्या createIndex() वास्तव में करता है पर थोड़ा स्पष्ट है।


संपादित करें: टिप्पणी के रूप में this question में विस्तार से बताया है कि एक ही नाम है, लेकिन एक मौजूदा सूचकांक की तुलना में विभिन्न विकल्पों के साथ createIndex() कॉल करने में त्रुटि MongoError: Index with name: **indexName** already exists with different options फेंक होगा में स्पष्ट करने के लिए ZitRo को धन्यवाद।


आप जांच के लिए अन्य कारणों से है, तो आप वर्तमान सूचकांक डेटा दो तरह से उपयोग कर सकते हैं:

  1. v3.0 के रूप में, हम उपयोग कर सकते हैं db.names.getIndexes() जहां names का नाम है संग्रह। Docs here
  2. v3.0 से पहले, आप system.indexes संग्रह तक पहुंच सकते हैं और find को describes below के रूप में उपयोग कर सकते हैं।
+1

ध्यान दें कि हम 'मोंगोइरर: नाम के साथ इंडेक्स: ** इंडेक्सनाम ** पहले से ही 'createIndex' कर कर अलग-अलग विकल्पों के साथ मौजूद हैं' त्रुटि पकड़ सकते हैं। तो 'db.collection.getIndexes()' का उपयोग कभी-कभी समझ में आता है। अधिक जानकारी के लिए [यह प्रश्न] देखें (http://stackoverflow.com/q/30232081/2590150)। – ZitRo

+0

यह उत्तर आश्चर्यजनक है। मैं यहां आया क्योंकि 'createIndex' मेरे सर्वर के प्रत्येक बूट (mongo 2.6) पर 30 सेकंड ऊपर ले रहा है। निश्चित रूप से यह पुष्टि करने में लंबा समय नहीं लगता है कि सूचकांक मौजूद है या नहीं? – Thor84no

+0

@ Thor84no 2.6 'createIndex' का उपयोग नहीं करता है, यह' sureIndex' https://docs.mongodb.com/v2.6/core/index-creation/ – metame

12

उपयोग db.system.indexes और उस पर खोज: की तरह।

, उदाहरण के लिए, आप एक सूचकांक 'indexname' कहा जाता है, तो आप इस तरह इसके लिए खोज कर सकते हैं:

db.system.indexes.find({'name':'indexname'}); 

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

db.system.indexes.find({'name':'indexname', 'ns':'dbname.collection'}); 

या, यदि आप पूरी तरह से डाटाबेस का नाम जोड़ने को नफरत ...

db.system.indexes.find({'name':'indexname', 'ns': {$regex:'.collection$'}}); 

है कि एक साथ खींच ...

तो, आप कर रहे हैं समाप्त की जांच होगी:

if(db.system.indexes.find({name:'indexname',ns:{$regex:'.collection$'}}).count()==0) { 
    db.collection.createIndex({blah:1},{name:'indexname'}) 
} 
+0

क्या यह 3.4 संस्करण पर काम करता है। मैंने कोशिश की लेकिन यह कंसोल पर कुछ भी नहीं देता है। –

+0

@ सोहम शेट्टी इसे v3.0 के रूप में बहिष्कृत कर दिया गया है। अब आपको 'db.name.getIndexes() 'का उपयोग करना चाहिए जहां' name' आपके संग्रह का नाम है। – metame

संबंधित मुद्दे