通过 mongoose 模式将数据存储在 mongodb 中,不传递唯一真键的值

Posted

技术标签:

【中文标题】通过 mongoose 模式将数据存储在 mongodb 中,不传递唯一真键的值【英文标题】:sotre data in mongodb via mongoose schema with not passing value of unique true key 【发布时间】:2017-09-15 20:40:02 【问题描述】:

我有一个像这样的猫鼬模式:-

var UserSchema = new Schema(
name: type: String, required: true,
email: type: String, required: true,unique: true,
mobNum: type: String, required: true, unique: true,
username: type: String, unique: true,
dob: type: Date,
isTempUser: type: String, default: true,
mobNumVerified: type: Boolean, default: false,
emailVerified: type: Boolean, default: false,
registrationComplete: type: Boolean, default: false)

当我尝试使用此代码将数据保存在数据库中时:-

                    let newUser = User();
                    newUser.name = name;
                    newUser.email = email;
                    newUser.mobNum = mobNum;
                    newUser.save();

当我运行服务器并点击我的 api 注册新用户时,只有第一次数据在 mongodb 中成功保存,当我尝试在 db 中保存不同的值时,我得到了错误

那是:-

 MongoError: E11000 duplicate key error collection: okhlee-kdb-promoter.users index: username_1 dup key:  : null 
    at Function.MongoError.create (D:\Okhlee.com\KDB Promoter backend\node_modules\mongodb-core\lib\error.js:31:11)
    at toError (D:\Okhlee.com\KDB Promoter backend\node_modules\mongodb\lib\utils.js:139:22)
    at D:\Okhlee.com\KDB Promoter backend\node_modules\mongodb\lib\collection.js:659:23
    at handleCallback (D:\Okhlee.com\KDB Promoter backend\node_modules\mongodb\lib\utils.js:120:56)
    at D:\Okhlee.com\KDB Promoter backend\node_modules\mongodb\lib\bulk\unordered.js:465:9
    at handleCallback (D:\Okhlee.com\KDB Promoter backend\node_modules\mongodb\lib\utils.js:120:56)
    at resultHandler (D:\Okhlee.com\KDB Promoter backend\node_modules\mongodb\lib\bulk\unordered.js:413:5)
    at D:\Okhlee.com\KDB Promoter backend\node_modules\mongodb-core\lib\connection\pool.js:461:18
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)
  name: 'MongoError',
  message: 'E11000 duplicate key error collection: okhlee-kdb-promoter.users index: username_1 dup key:  : null ',
  driver: true,
  code: 11000,
  index: 0,
  errmsg: 'E11000 duplicate key error collection: okhlee-kdb-promoter.users index: username_1 dup key:  : null ',
  getOperation: [Function],
  toJSON: [Function],
  toString: [Function] 

据我所知,此错误与 username 的重复值有关,但是当我将数据保存在 db 中时,我没有在第一个 api 上存储 username 我保存 用户名 下次用户访问我们的网页时。

所以请解决这个错误。

【问题讨论】:

添加你使用过的数据。还有 MongoDB 版本和 Mongoose 版本 【参考方案1】:

在 MongoDB 中为 unique field can not be empty in multiple records。如果您的用户一开始不会提供用户名,但您仍然需要该字段是唯一的,那么您可以在第一次尝试时存储一个随机字符串或手机号码或电子邮件作为用户名。我认为这对你有用。

如果您希望创建一个随机字符串并将其分配给用户名,您可以使用加密尝试以下操作:

  let newUser = User();
  newUser.name = name;
  newUser.email = email;
  newUser.mobNum = mobNum;
  require('crypto').randomBytes(48, function(err, buffer) 
        if(err)  throw err 
        username = buffer.toString('hex');
        newUser  = username;
        newUser.save();
  );

【讨论】:

以上是关于通过 mongoose 模式将数据存储在 mongodb 中,不传递唯一真键的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose 的 find() 时遇到问题,正确的使用方法是啥?

node21---mongoose

将站点配置存储为 Mongoose 模型

无法连接到数据库 - Mongoose nestJS

Mongoose - 在模式中存储 Set 的最佳方法

将图像文件存储在猫鼬模式中的二进制数据中并以 html 形式显示图像