我知道当文档被插入到集合中时,_id列如何包含时间戳的表示。下面是一个将其转换为时间戳的在线实用程序:http://steveridout.github.io/mongo-object-time/
我想知道的是,对象id字符串本身是否保证保持升序?也就是说,这个比较总是返回true吗?
"newest object id" > "second newest object id"
发布于 2015-06-26 02:20:19
不,没有任何保证。从official documentation (at the time of the original answer)
在一秒钟内,ObjectId值的顺序和生成时间之间的关系并不严格。如果多个系统或单个系统上的多个进程或线程生成值,则在一秒钟内;ObjectId值不代表严格的插入顺序。客户端之间的时钟偏差也可能导致不严格的排序,甚至对于值也是如此,因为客户端驱动程序会生成Mongod值,而不是ObjectId进程。
来自latest docs的
虽然ObjectId值应该随着时间的推移而增加,但它们不一定是单调的。这是因为他们:
仅包含一秒的时间分辨率,因此在同一秒内创建的ObjectId值没有保证的顺序,并由客户端生成,这些客户端可能具有不同的系统时钟。
发布于 2015-06-26 02:21:59
_id: ObjectId(4字节时间戳,3字节机器id,2字节进程id,3字节增量)
这是id结构。因此,只有最后3个字节会唯一地递增。所以你的问题的答案是肯定的。
发布于 2018-12-11 21:48:48
对于mongo version >= 3.4,Objectid的生成稍有不同。它的结构是:
因此,前4个字节仍然是Unix时代以来的秒数,它仍然几乎是递增的,但并不严格。
https://docs.mongodb.com/manual/reference/bson-types/#objectid
https://stackoverflow.com/questions/31057827
复制相似问题