Подтвердить что ты не робот

Порядок сортировки mongodb на _id

Интересно, как mongodb сравнивает поле "_id" при выполнении запроса следующим образом:

db.data.find({"_id":{$gt:ObjectId("502aa46c0674d23e3cee6152")}}).sort({"_id":1}).limit(10);

Является ли это чисто основанием для временной метки id?

4b9b3361

Ответ 1

Чтобы немного расширить то, что сказал Андре:

Поскольку временная метка ObjectID предназначена только для второго, два (или более) объекта ObjectID могут быть легко созданы с тем же значением для метки времени (первые 4 байта). Если они были созданы на одном компьютере (идентификатор машины - следующие 3 байта), по тому же процессу (PID - следующие 2 байта), то единственное, что их отличить, - это поле "inc", последние 3 байта в конце.

См. здесь полную спецификацию:

http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

Это поле "inc" является либо постоянно увеличивающимся полем (тогда вы можете разумно ожидать, что сортировка будет в порядке вставки/создания), либо случайное значение (тогда, вероятно, уникальное, но не упорядоченное), предполагая, что спецификация реализована правильно, конечно. Обратите внимание, что идентификаторы ObjectID могут быть сгенерированы драйвером или приложением (или действительно вручную), а не самим MongoDB, поэтому, если вы не имеете полного контроля над тем, как они сгенерированы, то может применяться любое или все вышеперечисленное.

Ответ 2

В некотором роде вы правы, если сортировать по _id, вы будете сортировать по времени ввода. Это не означает, что единственное сравнение выполняется в отношении метки времени. ObjectID - это тип объекта BSON самостоятельно, они могут быть напрямую сопоставлены друг с другом. Когда они начинаются с отметки времени, логически вытекает, что те, что в прошлом, будут меньше, чем в будущем.

Более подробную информацию вы можете найти в документации

Ответ 3

скопировать пасту из спецификаций Mongo http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

Связь между порядком значений ObjectId и временем генерации не является строгой в течение одной секунды. Если несколько систем или несколько процессов или потоков в одной системе генерируют значения за одну секунду; Значения ObjectId не представляют собой строгий порядок вставки. Перекос часов между клиентами также может привести к нестандартному упорядочению даже для значений, поскольку драйверы клиента генерируют значения ObjectId, а не процесс mongod.