使用mongoose在mongodb模式中使用ensureIndex

时间:2012-11-07 15:30:31

标签: javascript mongodb indexing mongoose

我想在ensureIndex上调用authorName,命令是什么以及我应该在这个代码中放哪个位置?

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

4 个答案:

答案 0 :(得分:25)

您不直接致电ensureIndex,表示该字段应在您的架构中编入索引,如下所示:

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

根据该定义,当您通过ensureIndex电话注册模型时,Mongoose会为您致电mongoose.model

要查看Mongoose正在进行的ensureIndex调用,请通过在代码中添加以下内容来启用调试输出:

mongoose.set('debug', true);

答案 1 :(得分:12)

您可以使用以下声明:

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

例如,您想要进行一些集成测试,因此您需要快速删除集合。 在这种情况下,即使选项autoIndex设置为true,mongoose也不会在运行时再次设置索引。 在这种情况下,这个答案可能很有用。

答案 2 :(得分:4)

您可以调用Schema #index方法来创建索引

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

你可以听创建索引事件。

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

注意:创建索引的过程是异步的。因此,当您创建唯一索引时,无法插入重复数据。或创建索引将失败;

答案 3 :(得分: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();