MongoDB自动增量ID

时间:2014-01-19 15:25:36

标签: mongodb

MongodDB中自动生成的ID的大小为12 Bytes,大整数的大小为8 bytes。我在运行Ubuntu Server的4台机器上有一个mongodb集群,但我现在只是测试一下。插入只能通过一个服务器来完成,该服务器是一个nodejs服务器,但是可以使用运行世界各地的本地c应用程序和nodejs服务器的各种机器来完成更新和删除。

由于我可以完全控制插入,使用自动增量ID不是更好吗?

  • 在1MB的内存中,你可以节省87381个12字节的ID和131027的8个 byte ids。
  • 是否值得去自动增量ID并且有益处 除了保存记忆?
  • 性能方面不会比较8字节的id比12更快 字节ID,如果我做索引,它不会减小大小吗?

我是怎么做到的:

我有这份文件

{id:0 latestId:174845423}

我很少将它递增1,我的大多数插入都是批量插入,因此nodejs服务器修改要插入循环的文档,为每个插入一个递增的id,在插入操作结束时添加i更新具有最后一个id值的最新id。

3 个答案:

答案 0 :(得分:6)

使用分布式系统时,“自动增量”始终是一个问题,因为它会创建一个瓶颈:每个新增量都需要读取以前的数据..就像其他一些并行请求一样。

一般来说,“自动增量”限制并行性,特别是在分布式系统上。

答案 1 :(得分:0)

如果没有分布式系统,则可以使用节点js的文件系统(fs)模块并跟踪那里的所有记录。然后,您可以将该值保存为mongo dB。

P.S。 -如果您没有分布式系统,则可以使用。

或者
您可以为传入的数据条目创建一个记录队列,然后将其保存为dB。

答案 2 :(得分:0)

当业务用例要求文档的数字值递增时,我们使用另一种方法。

在数据库中,我们创建一个具有索引的集合:

db.createCollection('sequences');

稍后,我们需要一个集合的增量值,我们创建一个序列:

db.sequences.insertOne ( {_id: 'orderId' , value : 0 } );

然后,当我们需要下一个值时,我们使用以下方法检索它:

async function getNextValue(seqName) {
    const sequence = await db.sequences.findOneAndUpdate(
        { _id: 'orderId' },
        { $inc: { value: 1 } },
        { returnOriginal: false }
    );
    return sequence.value.value;
}

因此,在创建文档时,1)我们从数据库检索下一个序列,2)添加到模型,3)照常插入文档模型。

好处:

  • 线程/进程/服务器安全:一旦检索到下一个值,它将对于文档是唯一的。
  • 序列与集合保存在同一数据库中:来自任何平台的任何代码或脚本都可以插入文档。

注意事项:

  • 性能。根据您正在执行的操作,但是通常情况下,一次额外的数据库往返操作才能获得顺序,不会造成太大的伤害。