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

标签 javascript node.js mongodb mongoose

我使用 mongodb 作为数据库,使用 mongoose 作为 ORM。我的模式中有一个 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:

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

最佳答案

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

如果你想为每个新文档调用它,你需要把它变成一个 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属性,也是唯一的。

关于javascript - Mongodb 在模式级别生成默认随机数正在生成相同的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44840482/

相关文章:

php - 如何在 PHP 中将 MongoDB BSONDocument 转换为有效的 JSON?

java - MongoDB 和 Java 驱动程序 : "ignore case" in query

javascript - 如何阻止 tinymce 删除我的 <link> 标签?

javascript - ng-lodash : ReferenceError: _ is not defined

javascript - Angularjs ng-include 不包括任何 View

javascript - 将对象字符串转换为JS对象

node.js - 在 openshift 上运行 node.js sails 应用程序

javascript - 当所有 Node Worker 死亡时,集群 Master 会发生什么?

javascript - JS 无效/意外 token : ��#

json - Grails-将JSONObject保存到MongoDB时出错