我有一个MEN(MongoDB,Express,Node)应用程序,当我插入第一个项目时一切都很好,但是当我想添加第二个项目时我得到了这个错误:
E11000 duplicate key error index: local.movies.$title_1 dup key: { : null }
如果我然后删除第一行,然后再次插入一个项目就可以了,但是当我想添加第二个项目时,我仍然会收到错误。
我真的在这个上拉头发,似乎无法找到问题:(
希望有人可以帮助我:)。
顺便问一下如何从命令行访问我的表?我尝试了db.movies.find()
,movies.find()
和其他选项,但没有任何反应,当我输入show collestions
时,我只获得system.indexes
。
如何从命令行删除表并尝试创建一个新表?
这是我的模特:
var mongoose = require('mongoose');
var MovieSchema = require('../schemas/movie');
var Movies = mongoose.model('Movie', MovieSchema);
module.exports = Movies;
这是我的架构:
var mongoose = require('mongoose');
var MovieSchema = new mongoose.Schema(
{
movieTitle: { type: String, required: true, index: { unique: true } },
movieYear: { type: String, required: true },
movieDirector: { type: String, required: true },
movieImdbLink: { type: String, required: true }
}
);
module.exports = MovieSchema;
我也试过没有索引,movieTitle: { type: String, required: true }
这是我的插入/更新功能:
// insert/update movie
exports.save = function(req, res){
var _id = (req.body._id !== 'undefined') ? req.body._id : null;
var movieTitle = req.body.movieTitle;
var movieYear = req.body.movieYear;
var movieDirector = req.body.movieDirector;
var movieImdbLink = req.body.movieImdbLink;
var movie = null;
if(_id){
var query = {_id: _id};
Movies.update(
query,
{
$set:{
movieTitle: movieTitle,
movieYear: movieYear,
movieDirector: movieDirector,
movieImdbLink: movieImdbLink
}
},
{safe:true},
function(err, result, raw){
if(err){
console.log(err);
res.send(500);
}
else{
res.send(200);
}
}
);
}
else{
movie = new Movie(
{
movieTitle: movieTitle,
movieYear: movieYear,
movieDirector: movieDirector,
movieImdbLink: movieImdbLink
}
);
movie.save(function(err){
if(err){
res.redirect('/movies/?msg=' + err.message);
}
else{
res.redirect('/movies');
}
});
}
};
答案 0 :(得分:1)
movieTitle有一个唯一的索引:true。第一次启动应用程序时会创建此索引。其余的时间,mongoose检查索引是否存在。如果它不会创建它。
当你删除唯一声明时,mongoose不会像你想象的那样重新创建索引。也许在功能版本中它会。
您必须手动删除索引(see mongo docs)或整个数据库。
重新启动应用后,将创建新索引。
我希望有帮助
答案 1 :(得分:0)
Mongoose不会重新创建索引
因此,如果您创建了一个唯一等于true的索引,则无法更改该索引,直到删除索引或删除db。
因此,只需删除数据库或tittle索引,然后使用 unique = false
重新创建它