【问题标题】:Mongo/mongoose schema is being cached somewhereMongo/mongoose 模式被缓存在某处
【发布时间】:2016-10-23 10:13:54
【问题描述】:
var UserSchema = new Schema({
    "username": {type: String, unique: true },
    "password": String,

})

所以我将属性名称更改为用户名,从那时起事情就变得糟糕了。

无论我做什么,我都会不断收到错误

E11000 重复键错误索引:test.users.$name_1 dup key: { : null }

即使我尝试删除数据库、更改要连接的数据库的名称并从架构中删除 unique: true 时,我仍然会收到此错误。

无论我做什么,我都无法删除这个错误,为什么即使在我删除每个数据库并删除唯一属性之后它仍然抛出这个错误......

这里是保存功能 -

router.post('/register',  function(req, res){
    var user = new User();

    user.username = req.body.username;

    //hash the password
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash(req.body.password, salt, function(err, hash) {
            user.password = hash;
            user.save(function(err){
                if(err){
                    console.log(err.message);
                    if(err.message === "E11000 duplicate key error index: test.users.$name_1 dup key: { : \"" + user.username + "\" }"){ //this was working fine before i changed user.name to user.username 
                        res.json({
                            error: "name already taken"
                        });
                    }else{
                        res.json({
                            error: "There was an error processing your registration."
                        });
                    }
                    return(err);
                }
                res.json({user: user});
            })
        });
    });


});

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    该错误似乎是因为您已经插入了一个名称(或用户名)属性为空的文档。 由于用户名有唯一索引,因此您只能拥有一个用户名为空的文档。

    看到这个问题:

    E11000 duplicate key error index in mongodb mongoose

    此外,如果您从 Mongoose 架构中删除 {unique: true},则不会将其从数据库中删除。您实际上也必须从 Mongo 中删除索引 - 索引仍然存在,您的 Mongoose Schema 将无法确保启动时有索引。 Mongoose 将在启动时在 MongoDB 中运行 ensureIndex(),以确保该字段被索引,但从 Mongoose 中删除它并不会真正从 Mongo 中删除它,必须手动完成。

    【讨论】:

    • 我已经删除了我正在使用的数据库.. 不应该删除索引吗?
    • 如何删除索引?我清除了所有正在使用的数据库,但仍然出现错误
    • 还没弄明白
    • 为了澄清,您正在删除数据库并从您的猫鼬模式中删除 unique: true 对吗?您是否有任何其他可能会干扰的 Mongoose 模式(即相同的集合名称)?因为您的错误引用了“ test.users.$name_1 ”,所以我认为在 name 字段上不断创建相同的索引。所以,您在 name 字段上有一个索引,但您没有使用 name 字段不再--您将其更改为用户名--因此您输入的每个用户名/密码都有 {name: null},这在唯一索引上失败。
    • 连接到 Mongo Shell。您的数据库称为“测试”对吗?而你的收藏是“用户”?如果是这样,请运行 use test 然后运行 ​​db.users.dropIndex({"name": -1}) 以确保您已删除索引。
    【解决方案2】:

    这基本上是说您有多个文档,其 Name 属性的值为“null”。也许您仍然有一些具有该属性的文档,或者仍然在某处引用了 name 属性?这是来自 mongo 文档

    如果文档没有唯一索引字段的值 索引,索引将存储该文档的空值。因为 唯一约束,MongoDB 将只允许一个文档 缺少索引字段。如果有多个文档没有 索引字段的值或缺少索引字段,索引 构建将失败并出现重复键错误。

    【讨论】:

    • 但是我删除了所有使用它的数据库,并且我在保存时也没有尝试输入空值
    • 好像索引还在,打开mongo shell可以查看所有索引。如果它在那里,请将其删除。 docs.mongodb.com/manual/tutorial/manage-indexes
    • 它不存在。我把它们都扔了。仍然报错。
    • 用户名和密码是您架构中仅有的 2 个吗?如果没有,请发布整个架构。你也可以发布你的保存功能吗?
    • 我更新了它,是的,这就是我现在的整个架构,我只是想在添加新东西之前让它工作。
    【解决方案3】:

    从来没有真正解决这个问题,我最终做的是删除我的数据文件夹并重新创建它。

    【讨论】:

      【解决方案4】:

      您需要从 mongo 数据库中删除索引。

      在启动时 mongoose 设置集合索引,例如:

      db.collection.createIndex({ fieldA: 1 }, { unique: true, background: true })
      

      要删除索引,您必须检查索引:

      db.collection.getIndexes()
      

      使用索引名称删除它:

      db.collection.dropIndex("index_name")
      

      并确保更改 mongoose 架构以避免重置索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-05
        • 2011-05-28
        • 2012-10-14
        • 1970-01-01
        • 2019-03-03
        • 1970-01-01
        • 2019-06-23
        • 2017-12-07
        相关资源
        最近更新 更多