MongodDB中自动生成的ID的大小为12 Bytes
,大整数的大小为8 bytes
。我在运行Ubuntu Server的4台机器上有一个mongodb集群,但我现在只是测试一下。插入只能通过一个服务器来完成,该服务器是一个nodejs服务器,但是可以使用运行世界各地的本地c应用程序和nodejs服务器的各种机器来完成更新和删除。
由于我可以完全控制插入,使用自动增量ID不是更好吗?
我是怎么做到的:
我有这份文件
{id:0 latestId:174845423}
我很少将它递增1,我的大多数插入都是批量插入,因此nodejs服务器修改要插入循环的文档,为每个插入一个递增的id,在插入操作结束时添加i更新具有最后一个id值的最新id。
答案 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)照常插入文档模型。
好处:
注意事项: