Mongoose 不创建索引

IT技术 javascript node.js mongodb mongoose
2021-02-20 05:48:32

尝试创建 MongoDB 索引。使用 Mongoose ODM 并在下面的架构定义中,我将用户名字段设置为唯一索引。集合和文档都被正确创建,只是索引不起作用。所有文档都说应该在启动时运行 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);
});
6个回答

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

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

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

mongoose.set('debug', true);

调试日志将向您显示ensureIndex它为您创建索引调用。

谢谢约翰尼,我尝试了你的建议,虽然它没有显示错误,但我看到的只是插入函数,没有确保索引。这让我认为,尽管文档说明 autoIndex 默认设置为 true,但 autoIndex 并未打开。我添加autoIndex:true到我的收藏设置中并且它起作用了。现在我已经手动设置autoIndex:true并进行调试显示了 ensureIndex 操作。
2021-05-08 05:48:32
谢谢 wintzer,这对我有帮助。我也在 MongoHQ。
2021-05-12 05:48:32
很有用,但无法解决问题,即使在字段上设置索引和唯一性,它也不会调用确保索引
2021-05-15 05:48:32

Mongoose 声明“如果索引已存在于数据库中,则不会被替换”信用)。

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

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

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

请注意,这是一项繁重的操作,因此对生产系统要谨慎!


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

E11000 duplicate key error collection

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

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

它可能会解决你的问题

var schema = mongoose.Schema({
speed: Number,
watchDate: Number,
meterReading: Number,
status: Number,
openTrack: Boolean,
 });
schema.index({ openTrack: 1 });
这会在 mongodb 上自动创建索引吗?我已经像上面那样定义了模型架构和索引,但是在 mongodb 中,它不创建索引,只有_id索引,我是否需要执行其他步骤才能创建?
2021-05-02 05:48:32
是的,如果您使用mongoose,它将自动创建
2021-05-08 05:48:32

当我在不工作的模型上挂钩索引事件时,我开始在控制台上收到错误消息,指出“字段 'retryWrites' 对于索引规范无效。” 我的应用程序中唯一引用“retryWrites”的地方是在我的连接字符串的末尾。我删除了它,重新启动了应用程序,索引重建成功。我将 retryWrites 放回原位,重新启动应用程序,错误消失了。我的用户集合(一直给我带来问题)是空的,所以当我使用 Postman 创建新记录时,我看到(使用 Mongo Compass Community)创建的新记录和索引现在出现。我不知道 retryWrites 做什么 - 今天是我使用它的第一天 - 但它似乎是我问题的根源。

哦,我为什么要使用它?它被添加到我从 Mongo 的 Atlas Cloud 站点中提取的连接字符串上。看起来很重要。唔。

检查mongoose连接选项未指定:

autoIndex: false