node-mongodb-native创建顺序对象ID

时间:2013-08-15 12:38:34

标签: node.js mongodb node-mongodb-native objectid

mongod-native以某种方式为插入的对象创建顺序对象id。如果数据库可以完成这项工作,我更喜欢它,或者mongodb-native至少可以使用与db相同的生成策略。

使用mongodb-native yield插入:

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

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

"_id" : ObjectId("520cc9f25aea0256082427e9")

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

顺便说一下。我正在使用

db: {
    forceServerObjectId: true
}

已经唯一的效果是,节点中的对象上没有设置_id ...

2 个答案:

答案 0 :(得分:2)

首先,查看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,我需要Here's one

从shell生成的_id不再是从客户端生成的_id“真实”。它们只有不同的播种值(机器和过程ID当然会有所不同)。

通过使用ObjectId进行分片,从2.4+开始,你有两个选择:范围和哈希。每个都有它的优点和缺点,最终,要么工作得很好,取决于所需的写入,读取,查询等的性质。您可以阅读有关here的更多信息。

答案 1 :(得分:0)

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

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

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

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