Я использую mongodb как базу данных с mongoose как ORM. У меня есть field booking_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:
Я ожидаю, что он будет генерировать случайные числа, но я не знаю, что произойдет во 2-й раз.
Вы устанавливаете значение по умолчанию только один раз, при создании схемы.
Если вы хотите, чтобы он был вызван для каждого нового документа, вам нужно превратить его в функцию, которую вызовет Mongoose:
default : function() {
return Math.floor(Math.random()*900000000300000000000) + 1000000000000000
}
Однако есть еще одна проблема с вашим кодом: значения, которые вы используете (900000000300000000000 и 1000000000000000), превышают Number.MAX_SAFE_INTEGER
, что может привести к проблемам.
Я бы предложил использовать mongoose.Types.ObjectId
как генератор идентификаторов, что также использует Mongoose и MongoDB для создания (уникальных) идентификаторов документа:
booking_id_customer : {
type : mongoose.Schema.Types.ObjectId,
default : mongoose.Types.ObjectId,
index : { unique: true }
}
Или повторно используйте свойство _id
документа, которое также является уникальным.
e
. Попробуйте с 10-значнымMath.floor(Math.random()*900000000300000000000 + 1000000000000000, 10)
ObjectId()
? Это будет уникальным каждый раз, когда вы генерируете. И в нем уже есть поле_id
. Как вы думаете, зачем нужен «другой» уникальный идентификатор?