0

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

使用 mongodb-native 插入会产生:

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

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

"_id" : ObjectId("520cc9f25aea0256082427e9")

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

顺便提一句。我正在使用

db: {
    forceServerObjectId: true
}

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

4

2 回答 2

2

首先,查看 an 的字节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.

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

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

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

通过使用ObjectIdfor 分片,从 2.4+ 开始,您有两个选择:范围和哈希。每个都有其优点和缺点,最终,它们都可以很好地工作,具体取决于所需的写入、读取、查询等的性质。您可以在此处阅读更多相关信息。

于 2013-08-15T13:57:03.890 回答
0

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

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

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

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

于 2013-08-15T12:45:51.990 回答