MongoDB,使用Mongoose重复键错误索引?

时间:2014-03-12 15:48:23

标签: node.js mongodb express mongoose

我有一个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');
            }
        });
    }
};

2 个答案:

答案 0 :(得分:1)

movieTitle有一个唯一的索引:true。第一次启动应用程序时会创建此索引。其余的时间,mongoose检查索引是否存在。如果它不会创建它。

当你删除唯一声明时,mongoose不会像你想象的那样重新创建索引。也许在功能版本中它会。

您必须手动删除索引(see mongo docs)或整个数据库。

重新启动应用后,将创建新索引。

我希望有帮助

答案 1 :(得分:0)

Mongoose不会重新创建索引

因此,如果您创建了一个唯一等于true的索引,则无法更改该索引,直到删除索引或删除db。

因此,只需删除数据库或tittle索引,然后使用 unique = false

重新创建它