【问题标题】:generate auto increment order_id in a collection在集合中生成自动递增 order_id
【发布时间】:2019-11-18 10:28:22
【问题描述】:

所以我有如下商店收藏:

{ "_id" : ObjectId("5cd4c45492e22458d9570841"), “store_id”:ObjectId(“5cd4c45492e22458d9570840”), “create_dt”:ISODate(“2019-05-10T00:22:44.000+0000”), "update_dt" : ISODate("2019-06-03T19:35:00.000+0000"), “order_id_counter”:NumberInt(1001) }

每个商店都有一个包含唯一store_id的记录,我需要构建一个函数getOrderId(store_id),每次调用该函数时自动返回生成的易于记忆的唯一order_id,每次调用都会自动增加order_id_counter的值该商店的记录为 1(每个商店都有自己的 order_id_counter,每个商店都有不同的值)。我也希望操作是原子的。

如何编写上述函数的代码?什么是最有效的方法?

【问题讨论】:

    标签: mongodb


    【解决方案1】:
    const Autoidmodule= {
        autogenerateId:(request,callback)=>{
            console.log(request)
            var milliseconds = new Date().getTime();
            const finalId=request+milliseconds;
            callback(null,finalId)
    
        },
    }
    module.exports = Autoidmodule;
    ...........................................................
    
    let type = "STORE";
    let autouserid;
    AutogenerateIdcontroller.autogenerateId(type, (err, data) => {
        autouserid = data;
    })
    

    【讨论】:

    • 这依赖于 Date 总是会增加的假设(NTP 服务器可以更新时间和闰秒是一件事),并且 Date 在所有服务器之间是一致的(时钟漂移是不可避免的,NTP 同步是有限的通过网络延迟),并且两个请求不能在同一毫秒内发生。分布式计算真的很难!如果可能的话最好使用数据库工具来解决这些问题,因为他们已经担心这些问题了
    • 一种快速的解决方法,无需在架构级别处理它,就是在 finalid 中附加 n 位随机数。 const finalId=request+milliseconds+random_number;
    • 这绝对是相当安全的,但在这一点上,它基本上是重新创建 mongo 的 ObjectId(4 字节时间戳 + 5 字节随机值 + 3 字节计数器从随机值开始)。 docs.mongodb.com/manual/reference/method/ObjectId
    【解决方案2】:

    在 mongo 中生成唯一递增数字的一种方法是使用 {store_id, current_count} 创建一个单独的集合,并使用 findAndModify$inc 操作来递增计数器并返回文档。在这种情况下,并不能保证一旦生成一个数字就可以成功创建相应的订单,因此您最终可能会出现空白。

    另一种方法是在 {store_id: 1, order_id_counter: 1} 组合上创建唯一索引 插入新订单有时会失败,需要重试。

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2011-07-01
      • 1970-01-01
      • 2017-01-11
      • 2013-08-24
      相关资源
      最近更新 更多