2012-11-07 8 views
7

का उपयोग करके mongodb स्कीमा में सुनिश्चित करेंइंडेक्स का उपयोग करके मैं ensureIndex पर पर कॉल करना चाहता हूं, इस कोड में आदेश और कहां रखा जाना चाहिए?mongoose

var mongoose = require('mongoose'); 

// defines the database schema for this object 
var schema = mongoose.Schema({ 
    projectName : String, 
    authorName : String, 
    comment : [{ 
     id : String,          
     authorName : String, 
     authorEmailAddress : { type : String, index : true }  
    }] 
}); 

// Sets the schema for model 
var ProjectModel = mongoose.model('Project', schema); 

// Create a project 
exports.create = function (projectJSON) { 
    var project = new ProjectModel({ 
     projectName : projectJSON.projectName, 
     authorName : projectJSON.authorName,  

     comment : [{ 
      id : projectJSON.comments.id,           
      authorName : projectJSON.comments.authorName,       
      authorEmailAddress : projectJSON.authorEmailAddress 
     }); 

     project.save(function(err) { 
      if (err) { 
       console.log(err); 
      } else{ 
       console.log("success"); 
      } 
     }); 
    }); 
} 

उत्तर

21

आप ensureIndex सीधे कॉल नहीं है, आप संकेत मिलता है कि क्षेत्र में इस तरह अपने स्कीमा में सूचीबद्ध किया जाना चाहिए:

var schema = mongoose.Schema({ 
    projectName : String, 
    authorName : { type: String, index: true } 
}); 

कि परिभाषा के आधार पर, नेवला आप के लिए ensureIndex कॉल करेंगे जब आप रजिस्टर mongoose.model कॉल के माध्यम से मॉडल।

ensureIndex कॉल कि नेवला कर रहा है देखने के लिए, अपने कोड के लिए निम्न जोड़कर डिबग आउटपुट सक्षम:

mongoose.connection.collections['my_collection'].ensureIndex({ "key": 1 }, { "unique": true }, callback); 

उदाहरण के लिए यदि आप चाहते करने के लिए:

mongoose.set('debug', true); 
+0

कई इंडेक्स एक अच्छी बात होगी, या यह प्रदर्शन धीमा कर देगा? मैं समझता हूं कि किसी संपत्ति पर एक इंडेक्स का मतलब है ओ (लॉग एन) – bouncingHippo

+0

@ बाउंसिंग हिप्पो आप केवल उन इंडेक्स को बनाना चाहते हैं जिन्हें आपको वास्तव में आवश्यक क्वेरी प्रदर्शन का समर्थन करने की आवश्यकता है। प्रत्येक अनुक्रमणिका दस्तावेज़ जोड़ते/संपादित करते समय काम जोड़ती है और वे डिस्क और मेमोरी लेते हैं। – JohnnyHK

+1

मैंने प्रश्न को संपादित किया है, क्या आप एक विशिष्ट उपयोगकर्ता द्वारा सभी टिप्पणियों को खोजने के अपने प्रयास को देखने पर ध्यान देंगे? धन्यवाद!! – bouncingHippo

11

आप इस बयान इस्तेमाल कर सकते हैं कुछ एकीकरण परीक्षण करें, इसलिए आपको अपने संग्रह को तेजी से छोड़ना होगा। उस स्थिति में mongoose रनटाइम के दौरान फिर से इंडेक्स सेट नहीं करता है, भले ही विकल्प autoIndextrue पर सेट हो। यह उत्तर उस मामले में उपयोगी हो सकता है।

1

पहले लेखक नाम फ़ील्ड पर इंडेक्स को परिभाषित करें और यदि आप मैन्युअल रूप से निश्चित आवश्यकता के कारण इंडेक्स को सुनिश्चित करना चाहते हैं तो आपको ऑटोइंडेक्स को झूठी पर सेट करना होगा। यह आपकी स्कीमा कैसा लगेगा क्या है:

var schema = mongoose.Schema({ 
    projectName : String, 
    authorName : {type : String, index : true} 
    comment : [{ 
     id : String,          
     authorName : String, 
     authorEmailAddress : { type : String, index : true }  
    }] 
}, { 
    // Turn-off auto indexing, we manually need to trigger indexing 
    autoIndex : false 
}); 

और आवश्यकता आप मॉडल पर ensureIndexes विधि आह्वान कर सकते हैं कि आप इस स्कीमा अर्थात ProjectModel.ensureIndexes() का उपयोग कर बनाया है पर आधारित है;

2

आप सूचकांक

let urlSchema = new Schema({ 
    url: String, 
    status: Number 
    } 
); 
urlSchema.index({ url: 1 }, { unique: true, background: true, dropDups: true }); 

बनाने के लिए आप सूचकांक घटना createing सुन सकते हैं स्कीमा # सूचकांक विधि कॉल कर सकते हैं।

let UrlModel = mongoose.model('url', urlSchema); 
UrlModel.on('index', function(error) { 
    if (error && error.message) { 
    console.log(`Url collection create index error:${error.message}`); 
    } 
}); 

नोट: इंडेक्स बनाने की प्रक्रिया एसिंक्रोनस है। इसलिए जब आप अद्वितीय इंडेक्स बनाते हैं, तो आप डुप्लिकेट डेटा नहीं डाल सकते हैं। या सूचकांक बनाना असफल हो जाएगा;

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