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 ...
答案 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