Javascript Mongoose不创建索引

Javascript Mongoose不创建索引,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,正在尝试创建MongoDB索引。使用MongooseODM并在下面的模式定义中,我将username字段设置为唯一索引。集合和文档都被正确创建,只是索引不起作用。所有文档都说应该在启动时运行ensureIndex命令来创建任何索引,但没有创建任何索引。如果有必要的话,我会用MongoLab来主持。我也多次放弃收集。怎么了 var schemaUser = new mongoose.Schema({ username: {type: String, index: { unique: tru

正在尝试创建MongoDB索引。使用MongooseODM并在下面的模式定义中,我将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);
});

钩住模型上的
'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
调用。

Mongoose声明()

例如,如果您之前定义了索引
{unique:true}
,但希望将其更改为
{unique:true,sparse:true}
,那么很遗憾Mongoose根本不会这样做,因为数据库中该字段已经存在索引

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

$ mongo
> use MyDB
> db.myCollection.dropIndexes();
> exit
$ restart node app
请注意,这是一个非常重要的问题,因此在生产系统上要小心


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

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


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

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


哦,我为什么要用它?它被钉在我从Mongo的Atlas Cloud网站上拔出的连接线上。看起来很重要。嗯。

这可能会解决你的问题

var schema = mongoose.Schema({
speed: Number,
watchDate: Number,
meterReading: Number,
status: Number,
openTrack: Boolean,
 });
schema.index({ openTrack: 1 });

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

autoIndex: false

在我的例子中,我必须明确指定
autoIndex:true

const User = new mongoose.Schema({
    name: String,
    email: String,
    password: String
 },
 {autoIndex: true}
)

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


解决方案是在终止脚本之前调用
wait model.ensureIndex()
。无论
autoIndex
选项值如何,它都能工作。

谢谢Johnny,我尝试了你的建议,虽然没有显示错误,但我看到的只是插入函数,没有ensureIndex。这让我想到,尽管文档说明自动索引默认设置为true,但该自动索引没有启用。我在我的收藏设置中添加了
autoIndex:true
,效果很好。现在,我已经手动设置了
autoIndex:true
,并启用了调试,显示了ensureIndex操作。感谢wintzer,这对我很有帮助。我也在MongoHQ上。这很有用,但无法解决问题,即使在一个字段上设置索引和唯一性,它也不会调用Sure IndexMongoDB。这会在mongodb上自动创建索引吗?我已经像上面一样定义了模型模式和索引,但是在mongodb中,它不创建索引,只有
\u id
索引存在,我需要执行其他步骤来创建吗?是的,如果使用mongoose,它将自动创建