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它为您创建索引的调用.
就我而言,我必须明确指定autoIndex: true:
const User = new mongoose.Schema({
name: String,
email: String,
password: String
},
{autoIndex: true}
)
Run Code Online (Sandbox Code Playgroud)
猫鼬声明“如果该索引已经存在于数据库中,则不会被替换”(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无法创建索引。
在这种情况下,我需要修复或删除具有重复字段的文档,然后再尝试创建索引。
| 归档时间: |
|
| 查看次数: |
11097 次 |
| 最近记录: |