2012-11-07 72 views
7

我想在authorName上調用ensureIndex,該代碼中的命令和位置應該放在哪裏?在mongodb模式中使用ensureIndex使用貓鼬

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.set('debug', true); 
+0

會有很多索引是好事,還是會降低性能?我明白,屬性上的單個索引意味着擁有O(log n) – bouncingHippo

+0

@bouncingHippo您只想創建實際需要支持所需查詢性能的索引。在添加/編輯文檔時,每個索引都會添加工作,並佔用磁盤和內存。 – JohnnyHK

+1

我編輯了這個問題,你想介紹一下我試圖找到特定用戶的所有評論嗎?謝謝!! – bouncingHippo

11

您可以使用此聲明:

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

例如要做一些集成測試,所以你需要快速刪除你的集合。 在這種情況下,即使選項autoIndex設置爲true,貓鼬在運行期間也不會再次設置索引。 在這種情況下,這個答案可能很有用。

1

首先在authorName字段上定義索引,如果因爲某些要求而手動調用ensureIndex,則必須將autoIndex設置爲false。這是你的模式將是什麼樣子:

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}`); 
    } 
}); 

注意:創建索引的過程是異步的。所以當您創建唯一索引時,不能插入重複數據。或創建索引將失敗;