Интересно, как mongodb сравнивает поле "_id" при выполнении запроса следующим образом:
db.data.find({"_id":{$gt:ObjectId("502aa46c0674d23e3cee6152")}}).sort({"_id":1}).limit(10);
Является ли это чисто основанием для временной метки id?
Интересно, как mongodb сравнивает поле "_id" при выполнении запроса следующим образом:
db.data.find({"_id":{$gt:ObjectId("502aa46c0674d23e3cee6152")}}).sort({"_id":1}).limit(10);
Является ли это чисто основанием для временной метки id?
Чтобы немного расширить то, что сказал Андре:
Поскольку временная метка ObjectID предназначена только для второго, два (или более) объекта ObjectID могут быть легко созданы с тем же значением для метки времени (первые 4 байта). Если они были созданы на одном компьютере (идентификатор машины - следующие 3 байта), по тому же процессу (PID - следующие 2 байта), то единственное, что их отличить, - это поле "inc", последние 3 байта в конце.
См. здесь полную спецификацию:
http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification
Это поле "inc" является либо постоянно увеличивающимся полем (тогда вы можете разумно ожидать, что сортировка будет в порядке вставки/создания), либо случайное значение (тогда, вероятно, уникальное, но не упорядоченное), предполагая, что спецификация реализована правильно, конечно. Обратите внимание, что идентификаторы ObjectID могут быть сгенерированы драйвером или приложением (или действительно вручную), а не самим MongoDB, поэтому, если вы не имеете полного контроля над тем, как они сгенерированы, то может применяться любое или все вышеперечисленное.
В некотором роде вы правы, если сортировать по _id
, вы будете сортировать по времени ввода. Это не означает, что единственное сравнение выполняется в отношении метки времени. ObjectID - это тип объекта BSON самостоятельно, они могут быть напрямую сопоставлены друг с другом. Когда они начинаются с отметки времени, логически вытекает, что те, что в прошлом, будут меньше, чем в будущем.
Более подробную информацию вы можете найти в документации
скопировать пасту из спецификаций Mongo http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification
Связь между порядком значений ObjectId и временем генерации не является строгой в течение одной секунды. Если несколько систем или несколько процессов или потоков в одной системе генерируют значения за одну секунду; Значения ObjectId не представляют собой строгий порядок вставки. Перекос часов между клиентами также может привести к нестандартному упорядочению даже для значений, поскольку драйверы клиента генерируют значения ObjectId, а не процесс mongod.