【问题标题】:Mongoose + Expressjs - E11000 duplicate key error index?Mongoose + Expressjs - E11000 重复键错误索引?
【发布时间】:2016-10-31 01:39:27
【问题描述】:

我不明白为什么在添加第一个条目后出现以下错误:

E11000 duplicate key error index: mydb.datasets.$id_1  dup key: { : null }

我的第一个条目中没有任何空值:

{
    "index" : "9IPZMW7IL",
    "name" : "Tweets",
    "owner_name" : "xxx",
    "read_key" : "fb6f9125f4ca15c33fea89416c3351d1",
    "write_key" : "d8a6c7e5fc73b5a91aa7a533565ed1f1",
    "data" : {
        "var1" : {
            "name" : "particles"
        }
    },
    "_id" : ObjectId("57729dc20cb70952424cdbb4"),
    "created_at" : ISODate("2016-06-28T15:54:42.576Z"),
    "entries_number" : 0,
    "public" : true,
    "__v" : 0
}

下面是我的代码:

// CRUD API:
// POST/ Create new dataset request
router.post("/", helper.authenticate, function(req, res) {
    // Used to set the dataset owner
    var sessionUser = req.session.user.name;
    // Get values from the post request
    var name = req.body.name;
    var isPublic = req.body.public != undefined ? true:false;
    // Delete the values from the request body so that we only keep information about the variables
    delete req.body.name;
    delete req.body.public;

    // This is so that we can loop through the object in reverse order
    // We do that so that the fields are saved in the right order on the db
    // (this way it will appear in the right order on the 'edit' view)
    var propertiesList = [];
    for (var property in req.body) {
        if (req.body.hasOwnProperty(property)) {
            propertiesList.push(property);
        }
    }
    propertiesList.reverse();

    var variablesFields = {};
    for (var i in propertiesList) {
        console.log(propertiesList[i])
        variablesFields[propertiesList[i]] = {name:req.body[propertiesList[i]],
                                    values: Array};
    }

    // Create dataset
    Dataset.create({
        index: helper.uniqueIndex(),
        name: name,
        owner_name: sessionUser,
        read_key: hat(),
        write_key: hat(),
        public: isPublic,
        data: variablesFields
    }, function(err, dataset) {
        if (err) {
            console.log("Error creating the dataset: " + err);
            req.session.error = "A problem occured when creating the dataset. Please try again.";
        } else {
            console.log("New dataset created with id: " + dataset._id);
            req.session.success = "Dataset " + name + " created successfully.";
        }
        res.redirect("/index");
    });
});

错误:

创建数据集时出错: WriteError({"code":11000,"index":0,"errmsg":"E11000 重复键 错误索引:mydb.datasets.$id_1 复制键:{:null }","op":{"index":"2IPZMWHGI","name":"PM 2","owner_name":"xxx","re​​ad_key":"fc31c152aa86070252c70c0304e4ca5c","write_key":"238110753c8762ce4a547fa02100a299","data":{"var1":{"name":"particles"}},"_id" :"57729dcf0cb70952424cdbb5","created_at":"2016-06-28T15:54:55.459Z","entries_number":0,"public":true,"__v":0}})

型号:

var datasetSchema = new mongoose.Schema({
    index: {type: String, required: true, index: {unique: true}},
    name: {type: String, required: true},
    owner_name: {type: String, required: true},
    read_key: {type: String},
    write_key: {type: String},
    public: {type: Boolean, default: false},
    data: {type: Object},
    entries_number: {type: Number, default: 0},
    created_at: {type: Date, default: Date.now},
    last_entry_at: {type: Date}
});

知道为什么以及如何解决这个问题吗?

【问题讨论】:

  • 您可能曾经在您的架构中有一个属性id,该属性具有unique : true。现在您将其重命名(为index?),旧的唯一索引仍然存在。见this question
  • 删除整个数据库并从一个新的数据库开始后它工作正常。 mongo 很奇怪!
  • 您是否先尝试删除有问题的索引?
  • @robertklep 我做到了,但没有运气,所以我不得不放弃数据库并重新开始。现在我遇到了一个更奇怪的 mongo 问题 - stackoverflow.com/questions/38090771/…

标签: node.js mongodb express mongoose


【解决方案1】:

我通过删除我最初声明为的“id”键解决了这个问题

id: { type: String, unique: true, required: true},

我删除了这一行并删除了初始集合,从而解决了问题。

【讨论】:

    猜你喜欢
    • 2017-01-03
    • 2018-01-19
    • 2018-10-12
    相关资源
    最近更新 更多