mongoose不创build索引

试图创buildMongoDB索引。 使用Mongoose ODM,并在我的模式定义下面我有用户名字段设置为唯一索引。 集合和文档都得到了正确的创build,只是索引不起作用。 所有的文档都说应该在启动时运行ensureIndex命令来创build任何索引,但是没有任何索引。 如果有问题,我正在使用MongoLab进行托pipe。 我也一再抛弃collections。 哪里不对。

var schemaUser = new mongoose.Schema({ username: {type: String, index: { unique: true }, required: true}, hash: String, created: {type: Date, default: Date.now} }, { collection:'Users' }); var User = mongoose.model('Users', schemaUser); var newUser = new Users({username:'wintzer'}) newUser.save(function(err) { if (err) console.log(err); }); 

挂钩模型上的'index'事件,以查看asynchronous创build索引时是否发生错误:

 User.on('index', function(err) { if (err) { console.error('User index error: %s', err); } else { console.info('User indexing complete'); } }); 

另外,通过调用以下命令启用Mongoose的debugging日志logging:

 mongoose.set('debug', true); 

debugging日志logging将显示您正在为您创build索引的ensureIndex调用。

Mongoose声明“如果索引已经存在于数据库中,它将不会被replace” ( 信用 )。 所以在这些情况下,你可以放弃现有的索引,然后mongoose会从新鲜的地方创build你的新索引。

 $ mongo > use MyDB > db.myCollection.dropIndexes(); > exit $ restart node app 

例如,如果将索引从{unique: true}更改为{unique: true, sparse: true} ,则可能需要使用此技术。

注意,这是一个繁重的操作,所以谨慎的生产系统!


在另一种情况下,我的索引没有被创build,所以我使用了JohnnyHK推荐的错误报告技术。 当我这样做时,我得到了以下回应:

 E11000 duplicate key error collection 

这是因为我的新索引添加了unique: true约束unique: true但是集合中存在的文档不是唯一的,所以Mongo无法创build索引。

在这种情况下,我需要修复或删除带有重复字段的文档,然后再次尝试创build索引。