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

Javascript 在模式级别生成默认随机数的Mongodb正在生成相同的数,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我使用mongodb作为数据库,mongoose作为ORM。我的模式中有一个字段id是唯一的,因此不能为空。因此,我设计了类似这样的代码 var bookingSchema = new Schema({ booking_id_customer: { type: Number, default : Math.floor(Math.random()*900000000300000000000) + 1000000000000000, ind

我使用mongodb作为数据库,mongoose作为ORM。我的模式中有一个字段id是唯一的,因此不能为空。因此,我设计了类似这样的代码

  var bookingSchema = new Schema({
    booking_id_customer: {
        type: Number,
        default : Math.floor(Math.random()*900000000300000000000) + 1000000000000000,
        index: { unique: true }
    },
它第一次运行得很好,但从第二次开始,我就犯了这个双重错误

    { [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:

我希望它生成随机数,但我不知道第二次出现了什么问题。

在创建模式时,您只设置了一次默认值

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

default : function() {
  return Math.floor(Math.random()*900000000300000000000) + 1000000000000000
}
但是,您的代码还有另一个问题:您正在使用的值(900000003000000000和1000000000000000)超过了,这可能会导致问题

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

booking_id_customer : {
  type    : mongoose.Schema.Types.ObjectId,
  default : mongoose.Types.ObjectId,
  index   : { unique: true }
}

或者重新使用文档的
\u id
属性,该属性也是唯一的。

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

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

default : function() {
  return Math.floor(Math.random()*900000000300000000000) + 1000000000000000
}
但是,您的代码还有另一个问题:您正在使用的值(900000003000000000和1000000000000000)超过了,这可能会导致问题

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

booking_id_customer : {
  type    : mongoose.Schema.Types.ObjectId,
  default : mongoose.Types.ObjectId,
  index   : { unique: true }
}

或者重新使用文档的
\u id
属性,该属性也是唯一的。

可能是由于
e
的原因,MONOSE没有比较您的值。尝试使用10位数的Math.floor(Math.random()*900000003000000000+100000000000000,10)为什么不直接使用
ObjectId()
?每次生成时,它都是唯一的。并且已经有一个
\u id
字段包含该字段。为什么您认为您需要“另一个”唯一标识符?可能是因为
e
,Monose没有比较您的值。请尝试使用10位
Math.floor(Math.random()*900000003000000000+100000000000000,10)
为什么不直接使用
ObjectId()
?每次生成时它都是唯一的。而且已经有一个
\u id
字段包含该字段。为什么您认为需要“另一个”唯一标识符?