nodemongodb本机创建顺序对象id



以某种方式mongod native为插入的对象创建顺序对象id。我更希望数据库能够完成这项工作,或者mongodb本机至少可以使用与数据库相同的生成策略。

使用mongodb原生收益插入:

"_id" : ObjectId("520cc99c00bd49c20180aad0")
"_id" : ObjectId("520cc99c00bd49c20180aad1")
"_id" : ObjectId("520cc99c00bd49c20180aad2")

使用shell插入同一个集合,生成一个真实的id:

"_id" : ObjectId("520cc9f25aea0256082427e9")

是什么原因造成的?这不是复制/分片的大问题吗?

Btw。我正在使用

db: {
    forceServerObjectId: true
}

唯一的效果是节点中的对象没有设置_id。。。

首先,查看ObjectId:的字节

ObjectId is a 12-byte BSON type, constructed using:
a 4-byte value representing the seconds since the Unix epoch,
a 3-byte machine identifier,
a 2-byte process id, and
a 3-byte counter, starting with a random value.

因此,如果您在一台机器上快速创建一系列ObjectId,您最终将创建基本相同的_id,因为它将包含几乎相同的字节,但3字节计数器除外(因为时间戳、进程id和机器标识符都相同)。

大多数MongoDB驱动程序/客户端默认在本地创建_id,而不是在数据库服务器上创建(由于它们都是开源的,您可以查看每个实现,以了解_id是如何生成的。诚然,有时确实需要一些挖掘。以下是NodeJS的一个示例)。

从shell生成的_id并不比从客户端生成的_id更"真实"。它们只是有不同的播种值(机器和进程ID当然会不同)。

通过使用ObjectId进行分片,从2.4+开始,您有两个选择:范围和哈希。每种方法都有其优缺点,最终,根据所需的写入、读取、查询等的性质,任何一种都能很好地工作。你可以在这里阅读更多。

如果您对顺序对象ID有问题,您也可以创建自定义和随机对象ID

由于_id字段始终是索引字段和主键,因此需要确保为每个对象生成不同的objectid。有一些优化用户定义的对象ID的指南:

http://docs.mongodb.org/manual/core/document/#record-文件

http://docs.mongodb.org/manual/reference/object-id/

最新更新