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

3

38

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"

Heisenberg answered 25/6, 2015 at 18:17 Comment(1)
Wait do you mean insertion order or just _id creation order?Twin
P
44

No, there is no guarantee whatsoever. From the official documentation (at the time of the original answer):

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.

And from the latest docs

While ObjectId values should increase over time, they are not necessarily monotonic. This is because they:

Only contain one second of temporal resolution, so ObjectId values created within the same second do not have a guaranteed ordering, and Are generated by clients, which may have differing system clocks.

Peculate answered 25/6, 2015 at 18:20 Comment(3)
Thanks for the reference. So turns out it is in ascending order on a wider time range but not in the orders smaller than a second.Heisenberg
Well, I would be careful, in the worst case scenario "a wider time range" can be really wide. Consider scenario when you insert a document, set system clock to 1 January 1970 and insert another one.Peculate
so...if the ObjectId is generated on one machine, then I can assume they are in an asc order?Autostability
B
10

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

Balmung answered 11/12, 2018 at 13:48 Comment(0)
D
9

_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.

Dane answered 25/6, 2015 at 18:21 Comment(1)
so your answer is partially correct however with the consideration from the answer above it's almost ascending but not strictly since the timestamp bytes have a higher value and it could be out of order in a smaller than 1 second scales.Heisenberg

© 2022 - 2024 — McMap. All rights reserved.