下面是我的用户模式在user.js模型-

var userSchema = new mongoose.Schema({
    local: {
        name: { type: String },
        email : { type: String, require: true, unique: true },
        password: { type: String, require:true },
    },
    facebook: {
        id           : { type: String },
        token        : { type: String },
        email        : { type: String },
        name         : { type: String }
    }
});

var User = mongoose.model('User',userSchema);

module.exports = User;

这就是我在控制器中使用它的方式

var user = require('./../models/user.js');

这就是我在数据库中保存它的方式

user({'local.email' : req.body.email, 'local.password' : req.body.password}).save(function(err, result){
    if(err)
        res.send(err);
    else {
        console.log(result);
        req.session.user = result;
        res.send({"code":200,"message":"Record inserted successfully"});
    }
});

错误- - - - - -

{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1  dup key: { : null }"} 

我检查了db集合,没有这样的重复条目存在,让我知道我做错了什么?

供您参考- req.body.email和req.body.password是抓取值。

我也检查了这篇文章,但没有帮助

如果我完全删除,然后它插入文档,否则它抛出错误“重复”错误,即使我在local.email中有一个条目


当前回答

以下是我的相关体会:

在“User”模式中,我将“name”设置为唯一键,然后运行一些执行,我认为已经设置了数据库结构。

然后我将唯一键更改为“用户名”,当我将数据保存到数据库时不再传递“名称”值。因此mongodb可能会自动将新记录的“name”值设置为空,这是重复的关键字。我尝试将“name”键设置为“User”模式中的非唯一键{name: {unique: false,类型:String}},以覆盖原始设置。然而,这并没有起作用。

最后,我提出了自己的解决方案:

当你保存数据记录时,只需设置一个随机的键值,不太可能与'name'键重复。Simply Math方法”+ Math.random() + Math.random()生成一个随机字符串。

其他回答

我用这种方法解决了我的问题。

只需进入您的mongoDB帐户->最后收集,然后删除您的数据库列。或者使用mongoDB compass,然后删除数据库,

当你在数据库中保存一些空值时,有时会发生这种情况。

我也有同样的问题。尝试调试不同的方法都没有找到答案。我试过放弃这个系列,之后效果很好。尽管如果您的集合有很多文档,这不是一个好的解决方案。但是如果您处于开发的早期状态,请尝试删除集合。

db.users.drop();

我想像向一个5岁的孩子解释一样解释这个问题的答案/解决方案,这样每个人都能理解。

我有一个应用程序。我想让人们用他们的电子邮件、密码和电话号码来注册。 在我的MongoDB数据库中,我希望根据他们的电话号码和电子邮件唯一地识别人们——因此这意味着每个人的电话号码和电子邮件都必须是唯一的。

然而,有一个问题:我发现每个人都有电话号码,但不是每个人都有电子邮件地址。

那些没有电子邮件地址的人已经向我保证他们下周会有一个电子邮件地址。但我还是想让他们注册——所以我告诉他们继续注册他们的电话号码,因为他们的电子邮件输入字段是空的。

他们这样做。

我的数据库需要一个唯一的电子邮件地址字段-但我有很多人用“空”作为他们的电子邮件地址。所以我在我的代码中告诉我的数据库模式允许空/空的电子邮件地址字段,当那些承诺下周将电子邮件添加到他们的个人资料的人时,我将用电子邮件唯一地址填充这些字段。

所以现在对每个人来说都是双赢(除了你;-]):人们注册,我很高兴有他们的数据…我的数据库很高兴,因为它被很好地使用……但是你呢?我还没有给出创建模式的代码。

代码如下: 注意:在电子邮件中的稀疏属性,是什么告诉我的数据库允许空值,稍后将被填充为唯一的值。

var userSchema =新的猫鼬。模式({ 本地:{ 名称:{类型:字符串}, email:{类型:字符串,要求:true,索引:true,唯一:true,稀疏:true}, 密码:{类型:字符串,要求:true}, }, facebook: { id:{类型:字符串}, token:{类型:字符串}, email:{类型:字符串}, 名称:{类型:字符串} } }); var User = mongoose.model('User',userSchema); 模块。出口=用户;

我希望我已经解释清楚了。 NodeJS编码/破解快乐!

我也遇到过这个问题,我解决了它。 此错误显示此处已经显示了电子邮件。因此,您只需要从Model for email属性中删除这一行。

unique: true

这是有可能的,即使它不起作用。所以只需要从MongoDB中删除集合并重新启动服务器。

这不是一个大问题,但像我这样的初级开发人员,我们知道这是什么样的错误,最后我们花了很长时间来解决它。

实际上,如果你删除数据库并再次创建数据库,然后尝试创建集合,那么它将正常工作。

➜ mongo
use dbName;
db.dropDatabase();
exit