猫鼬没有创建索引

win*_*zer 21 javascript mongoose mongodb node.js

尝试创建MongoDB索引.使用Mongoose ODM并在我下面的模式定义中,我将username字段设置为唯一索引.所有集合和文档都被正确创建,它只是不起作用的索引.所有文档都说应该在启动时运行ensureIndex命令来创建任何索引,但是没有任何索引.如果重要的话,我正在使用MongoLab进行托管.我也多次放弃收藏.怎么了.

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);
});
Run Code Online (Sandbox Code Playgroud)

Joh*_*yHK 22

'index'在模型上挂钩事件以查看异步创建索引时是否发生任何错误:

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

此外,通过调用以下命令启用Mongoose的调试日志记录:

mongoose.set('debug', true);
Run Code Online (Sandbox Code Playgroud)

调试日志记录将显示ensureIndex它为您创建索引的调用.

  • 谢谢Johnny,我尝试了你的建议,虽然它没有显示错误,但我看到的只是插入函数,没有ensureIndex.这让我想到,尽管文档声明默认情况下autoIndex设置为true,但autoIndex未启用.我将`autoIndex:true`添加到我的收藏夹设置中并且有效.现在我已经手动设置`autoIndex:true`并且打开调试显示了ensureIndex操作. (7认同)

Dan*_*she 6

就我而言,我必须明确指定autoIndex: true

const User = new mongoose.Schema({
    name: String,
    email: String,
    password: String
 },
 {autoIndex: true}
)
Run Code Online (Sandbox Code Playgroud)


joe*_*dle 5

猫鼬声明“如果该索引已经存在于数据库中,则不会被替换”credit)。

例如,如果您先前已定义了索引,{unique: true}但是您想要将其更改为{unique: true, sparse: true}不幸的是,Mongoose根本不会这样做,因为数据库中该字段已经存在索引。

在这种情况下,您可以删除现有索引,然后猫鼬将从新鲜的索引中创建一个新索引:

$ mongo
> use MyDB
> db.myCollection.dropIndexes();
> exit
$ restart node app
Run Code Online (Sandbox Code Playgroud)

请注意,这是一项繁重的操作,因此在生产系统上要当心!


在另一种情况下,没有创建我的索引,因此我使用了JohnnyHK推荐的错误报告技术。当我这样做时,我得到以下答复:

E11000 duplicate key error collection
Run Code Online (Sandbox Code Playgroud)

这是因为我的新索引正在添加约束,unique: true但是集合中存在不唯一的现有文档,因此Mongo无法创建索引。

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