MongoDB E11000重复键错误

12

我有一个模型,在第一次POST之后就一直出错。我正在创建一个调度应用程序,它有X天、房间和房间的时间段。

我遇到的问题是在数据库中创建Day对象。为了易读起见,我只有一个键值对。

day.model.js

var mongoose = require('mongoose');

// Day Schema
var daySchema = mongoose.Schema({
  name:{
    type: String,
    required: true,
  },
  createdAt:{
    type: Date,
    default: Date.now
  }
});

var Day = module.exports = mongoose.model('Day', daySchema);

// Get all Days
module.exports.getDays = function(callback, limit){
  Day.find(callback).limit();
};

// Add Day
module.exports.addDay = function(day, callback){
  var add = {
    name: day.name,
};
Day.create(add, callback);
};

day.routes.js

var express     = require('express');
var router      = express.Router();
var jwt         = require('jsonwebtoken');
var config      = require('../config/database');

Day = require('../models/day.model.js');

// Get all Days
router.get('/', function(req,res){
  Day.getDays(function(err, days){
    if(err){
      res.send(err);
    }
    res.json(days);
  }); 
});

// Add Day
router.post('/create', function(req,res){
  var day = req.body;
  Day.addDay(day, function(err, day){
    if(err){
      res.send(err);
    }
    res.json(day);
  });
});

module.exports = router;

示例 JSON

  1. {"name": "Monday"} - 这会在数据库中正常反映。
  2. {"name": "Tuesday"} - 这将引发一个11000错误。

错误

{
  "code": 11000,
  "index": 0,
  "errmsg": "E11000 duplicate key error collection: <collection-name>.days index: date_1 dup key: { : null }",
  "op": {
    "name": "Tuesday",
    "_id": "57fd89638039872dccb2230b",
    "createdAt": "2016-10-12T00:52:51.702Z",
    "__v": 0
  }
}

我困惑的是,我对于一个用户有同样的设置,但是当我要创建一个新的日期时,就会出现重复键错误。不确定我漏掉了什么或者做错了什么。谢谢。

6个回答

31

我认为你之前创建了一个名为days的集合,并在其中添加了一个名为date的属性,该属性通过唯一索引date_1进行了索引。

现在你已经将其删除,但是该集合仍然保留着这个索引。

这就是为什么它会报错:

duplicate key error collection: .days index: date_1 dup key: {: null}

这意味着你正在插入另一条记录,而该记录的date属性也是空的。

从控制台登录到mongodb并尝试执行以下操作:

db.collectionNameHere.getIndexes();
db.collectionNameHere.dropIndex('date_1');
db.collectionNameHere.getIndexes();

p.s. 您可以在您的问题或评论中提供任何额外数据,以帮助我/我们解决您的问题。


3
看起来集合内有一堆索引在开发期间被污染了。我之前用Robomongo删除了集合,但看起来它仍保留了这些索引。感谢您的帮助和非常清晰的答案。 - wsfuller
@Full-Hybrid 很高兴能够帮到你 (; - num8er
嗨,@num8er 我们需要每次删除索引吗?这是正确的解决方案吗? - Ravi Sharma
当然不是。这取决于具体情况。最好使用robo3t或其他工具,并正确管理索引。 - num8er

2
删除 集合 并重新运行。

2
这将如何解决问题所提出的问题? - Jason Aller
1
我不知道为什么或者怎么样,但对我来说这个方法可行。 - Candleout

1

虽然@num8er的回答是完全正确的,但更容易的方法是: 进入您的MongoDB 集合 => 您将看到索引选项卡,当您进入该选项卡时,您将看到不同的索引行,然后只需点击您不想要的行的删除索引按钮,或者删除所有索引并重新开始。


1

我也遇到了同样的错误。

E11000重复键错误集合:mydb.users 索引:token_1 dup key:{token:null}

示例

答案 - 我只是从数据库中删除了该集合。然后我发布了一些数据,现在它可以正常工作了。


0

你应该删除整个集合然后重新开始。 这就是为什么MongoDB会跟踪您之前的状态。


-2

我遇到了类似的问题,看到了这个问题并阅读了上面的评论。一开始我以为他在逗我,但后来我有了一个难以解释的顿悟。我删除了集合并存储了新文档,奇迹般地错误现在已经消失了。也许这是一些mongodb的bug,我不太确定。


一样的情况。我删除了集合,现在它可以工作了。 - Candleout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接