Mongodb генерирует случайные числа по умолчанию на уровне схемы и генерирует одинаковые числа

1

Я использую 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-й раз.

  • 0
    Может быть, Monoose не сравнивает вашу ценность из-за e . Попробуйте с 10-значным Math.floor(Math.random()*900000000300000000000 + 1000000000000000, 10)
  • 0
    Почему бы просто не использовать ObjectId() ? Это будет уникальным каждый раз, когда вы генерируете. И в нем уже есть поле _id . Как вы думаете, зачем нужен «другой» уникальный идентификатор?
Теги:
mongoose

1 ответ

6
Лучший ответ

Вы устанавливаете значение по умолчанию только один раз, при создании схемы.

Если вы хотите, чтобы он был вызван для каждого нового документа, вам нужно превратить его в функцию, которую вызовет 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 документа, которое также является уникальным.

  • 0
    Большое спасибо за очень четкий ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню