使用nodeJS的MongoDB ensurIndex和createIndex?

时间:2016-02-16 07:39:28

标签: node.js mongodb indexing mongoose

我无法为profile创建索引:

var user = new Schema({
      profile : "String",
      fullname:"String"
   })
    user.statics.createIndexOfProfile = function(callback){
    this.ensureIndex("profile",function(err,doc){
        if(err) {
          console.log(err+'sna');
          callback(err);
        }
         else {
          console.log(doc+'santhosh');
          callback(null,doc);
        }
      });

我收到的错误如this.ensureIndex is not a function

2 个答案:

答案 0 :(得分:6)

正确的API为ensureIndexes,可为模式中的每个ensureIndex 声明发送index个mongo命令。

这是一个样本

var UserSchema = new Schema({
    profile : {type: String, index: true},
    fullname: String
});

var User = mongoose.model('User', UserSchema);

User.ensureIndexes(function(err) {
    if (err)
        console.log(err);
    else
        console.log('create profile index successfully');
});

或通过index

var UserSchema = new Schema({
    profile : {type: String, index: true},
    fullname: String
});

UserSchema.index({ profile: 1 });

var User = mongoose.model('User', UserSchema);

运行上述代码后,检查MongoDB中的索引。

> db.users.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.users"
        },
        {
                "v" : 1,
                "key" : {
                        "profile" : 1
                },
                "name" : "profile_1",
                "ns" : "test.users",
                "background" : true
        }
]

答案 1 :(得分:1)

如果要为某些字段添加索引,只需将index: true添加到其定义中。

所以你可以做到以下几点:

var user = new Schema({
    profile : { type: String, index: true }, // field level
    // ...
});

user.index({ profile: 1 }); // schema level

来自mongoose docs

  

当您的应用程序启动时,Mongoose会自动调用   ensureIndex用于架构中的每个已定义索引。猫鼬会打电话   依次为每个索引确保索引,并发出一个'索引'活动   所有ensureIndex调用成功或存在时的模型   错误。