我不知道mongodb在执行如下查询时如何比较“ _id”字段:
db.data.find({"_id":{$gt:ObjectId("502aa46c0674d23e3cee6152")}}).sort({"_id":1}).limit(10);
它是纯粹基于id的时间戳部分吗?
Answers:
稍微扩展一下Andre所说的话:
由于ObjectID时间戳仅为第二个,因此可以轻松地创建两个(或多个)具有相同时间戳值(前4个字节)的ObjectID。如果这些是在同一台机器(机器ID-接下来的3个字节)上通过相同的进程(PID-接下来的2个字节)创建的,则唯一区分它们的就是“ inc”字段,最后3个字节在最后。
更新:2020年1月
这个答案仍然很受欢迎,因此值得进行一些更新。自从8年前写了这个答案以来,ObjectID规范已经得到了发展,现在时间戳之后的5个字节现在只是随机的,这将大大降低发生冲突的可能性。最后三个字节仍是递增的,但初始化为随机值以开始,从而再次降低了冲突的可能性。现在,ObjectID包含的上下文较少(您无法轻易分辨出它是在哪里生成的以及由哪个进程生成的),但是我猜想该信息并未以任何有意义的方式被使用,并且已被弃用,以便更好地对ID进行随机化。
结束更新
完整的规格请看这里:
https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectIDs-BSONObjectIDSpecification
假定规范正确实现,那么“ inc”字段要么是一个不断增加的字段(那么您可以合理地期望排序按插入/创建顺序),要么是一个随机值(那么可能是唯一的,但没有排序)。 。请注意,ObjectID可能是由驱动程序或应用程序生成的(或者实际上是手动生成的),而不是由MongoDB本身生成的,因此,除非您完全控制它们的生成方式,否则上述任何一项或全部均可适用。
ObjectId
还是auto increment
主键?
从Mongo规格复制粘贴 https://docs.mongodb.com/manual/reference/bson-types/#objectid
ObjectId值的顺序与生成时间之间的关系在一秒钟内并不严格。如果多个系统或单个系统上的多个进程或线程在一秒内生成值;ObjectId值不代表严格的插入顺序。客户端之间的时钟偏差也可能导致非严格排序,即使对于值也是如此,因为客户端驱动程序生成ObjectId值,而不是mongod进程。