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

8 回答 8

30

'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它为您创建索引所做的调用。

于 2012-09-17T04:13:32.380 回答
5

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 无法创建索引。

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

于 2017-01-24T09:25:52.603 回答
2

它可能会解决你的问题

var schema = mongoose.Schema({
speed: Number,
watchDate: Number,
meterReading: Number,
status: Number,
openTrack: Boolean,
 });
schema.index({ openTrack: 1 });
于 2019-01-11T05:48:24.490 回答
1

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

const User = new mongoose.Schema({
    name: String,
    email: String,
    password: String
 },
 {autoIndex: true}
)
于 2020-09-24T06:09:51.273 回答
1

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

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

于 2018-08-14T03:35:06.280 回答
1

正如您在 mongoose 文档https://mongoosejs.com/docs/guide.html#indexes中看到的那样,我们需要定义 schema.index 来创建索引。看看下面的代码进行测试:

  • 请注意,更新架构后重新启动服务器以进行检查。
const schemaUser = new mongoose.Schema(
  {
    username: {
      type: String,
      required: true,
      index: true,
      unique: true,
      dropDups: true,
    },
    hash: String,
    created: {
      type: Date,
      default: Date.now,
    },
  },
  {
    autoCreate: true, // auto create collection
    autoIndex: true, // auto create indexes
  }
)
// define indexes to be create
schemaUser.index({ username: 1 })

const User = mongoose.model('Users', schemaUser)
const newUser = new Users({ username: 'wintzer' })
newUser.save(function (err) {
  if (err) console.log(err)
})
于 2021-07-24T01:00:46.877 回答
0

检查猫鼬连接选项是否未指定:

autoIndex: false
于 2020-07-02T17:41:52.970 回答
0

我在编写数据导入命令行实用程序时遇到了这个问题。执行结束后,创建了一些索引,有些没有。

await model.ensureIndexes()解决方案是在终止脚本之前调用。无论autoIndex期权价值如何,它都有效。

于 2021-06-09T12:56:52.347 回答