Mongodb在模式级别生成默认随机数生成相同的数字

sac*_*hal 1 javascript mongoose mongodb node.js

我使用mongodb作为数据库,使用mongoose作为ORM.我的架构中有一个字段booking_id,这是唯一的,所以我不能将它取消.因此我设计了类似这样的代码.

  var bookingSchema = new Schema({
    booking_id_customer: {
        type: Number,
        default : Math.floor(Math.random()*900000000300000000000) + 1000000000000000,
        index: { unique: true }
    },
Run Code Online (Sandbox Code Playgroud)

它第一次完美运行,但从第2次开始,我得到了这个重复错误.

    { [MongoError: E11000 duplicate key error index: xx.bookings.$booking_id_customer_1 dup key: { : 4.439605615108491e+20 }]
  name: 'MongoError',
  message: 'E11000 duplicate key error index:
Run Code Online (Sandbox Code Playgroud)

我希望它能产生随机数,但我不知道第二次出现什么问题.

rob*_*lep 7

您在架构创建时只设置一次默认值.

如果您希望为每个新文档调用它,则需要将其转换为Mongoose将调用的函数:

default : function() {
  return Math.floor(Math.random()*900000000300000000000) + 1000000000000000
}
Run Code Online (Sandbox Code Playgroud)

但是,您的代码还有另一个问题:您正在使用的值(900000000300000000000和1000000000000000)超出Number.MAX_SAFE_INTEGER,这可能会导致问题.

我建议使用mongoose.Types.ObjectIdid生成器,这也是Mongoose和MongoDB用来创建(唯一)文档id的方法:

booking_id_customer : {
  type    : mongoose.Schema.Types.ObjectId,
  default : mongoose.Types.ObjectId,
  index   : { unique: true }
}
Run Code Online (Sandbox Code Playgroud)

或者重新使用_id文档的属性,这也是唯一的.