Is MongoDB _id (ObjectId) generated in an ascending order?

旧街凉风 提交于 2019-12-18 15:00:57

问题


I know how the _id column contains a representation of timestamp when the document has been inserted into the collection. here is an online utility to convert it to timestamp: http://steveridout.github.io/mongo-object-time/

What I'm wondering is if the object id string itself is guaranteed maintain the ascending order or not? i.e. does this comparison always return true?

"newest object id" > "second newest object id"


回答1:


No, there is no guarantee whatsoever. From the official documentation:

The relationship between the order of ObjectId values and generation time is not strict within a single second. If multiple systems, or multiple processes or threads on a single system generate values, within a single second; ObjectId values do not represent a strict insertion order. Clock skew between clients can also result in non-strict ordering even for values, because client drivers generate ObjectId values, not the mongod process.




回答2:


_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 bytes incrementer)

This is the id structure. So only last 3 bytes will increment uniquely. So the answer of your question is yes.




回答3:


For mongo version >= 3.4, the Objectid generation is changed a little. Its structs are:

  • a 4-byte value representing the seconds since the Unix epoch,
  • a 5-byte random value, and
  • a 3-byte counter, starting with a random value.

So the first 4 bytes are still the seconds since the Unix epoch, it is still almost ascending but not strictly.

https://docs.mongodb.com/manual/reference/bson-types/#objectid



来源:https://stackoverflow.com/questions/31057827/is-mongodb-id-objectid-generated-in-an-ascending-order

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!