我使用mongodb作为数据库,使用mongoose作为ORM。我的架构中有一个字段booking_id,这是唯一的,所以我不能将它取消。因此,我设计了类似的代码。
var bookingSchema = new Schema({
booking_id_customer: {
type: Number,
default : Math.floor(Math.random()*900000000300000000000) + 1000000000000000,
index: { unique: true }
},
它第一次完美运行,但是从第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:
我希望它能产生随机数,但我不知道第二次出现什么问题。
答案 0 :(得分:6)
您在架构创建时只设置一次默认值。
如果您希望为每个新文档调用它,您需要将其转换为Mongoose将调用的函数:
default : function() {
return Math.floor(Math.random()*900000000300000000000) + 1000000000000000
}
但是,您的代码还有另一个问题:您使用的值(900000000300000000000和1000000000000000)超过Number.MAX_SAFE_INTEGER
,这可能会导致问题。
我建议使用mongoose.Types.ObjectId
作为id生成器,这也是Mongoose和MongoDB用来创建(唯一)文档ID的原因:
booking_id_customer : {
type : mongoose.Schema.Types.ObjectId,
default : mongoose.Types.ObjectId,
index : { unique: true }
}
或者重复使用文档的_id
属性,这也是唯一的。