Разница между полями "id" и "_id" в MongoDB
Есть ли разница между использованием идентификатора поля или _ID из документа MongoDB?
Я спрашиваю об этом, потому что я обычно использую "_id", однако я видел этот вид ({id: -1}) в документации: http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Sortbyidtosortbyinsertiontime
ИЗМЕНИТЬ
Оказывается, документы были неправильными.
Ответы
Ответ 1
Я ожидаю, что это просто опечатка в документации. Поле _id
является первичным ключом для каждого документа. Он называется _id
, а также доступен через id
. Попытка использовать ключ id
может привести к ошибке illegal ObjectId format
.
Этот раздел просто указывает, что автоматически создаваемые ObjectID начинаются с отметки времени, чтобы можно было сортировать ваши документы автоматически. Это довольно круто, так как _id
автоматически индексируется в каждой коллекции. Подробнее см. http://www.mongodb.org/display/DOCS/Object+IDs. В частности, в разделе "Спецификация объекта BSON".
Объектный идентификатор BSON представляет собой 12-байтовое значение, состоящее из 4-байтовой метки времени (секунды с эпохи), трехбайтового идентификатора машины, двухбайтового идентификатора процесса и 3-байтового счетчика. Обратите внимание, что поля timestamp и counter должны быть сохранены в большом endian, в отличие от остальных BSON.
Ответ 2
Поле _id
является полем по умолчанию для Bson ObjectId и по умолчанию индексируется.
_id
и id не совпадают. Вы также можете добавить поле с именем id
, если хотите, но оно не будет индексом, если вы не добавите индекс.
Это просто опечатка в документах.
Ответ 3
id является псевдонимом для _id в mongoid.id, который возвращает _id документа.
https://github.com/mongodb/mongoid/blob/master/lib/mongoid/fields.rb#L47
Если поле _id не указано, объект ObjectedId создается автоматически.
Ответ 4
Мои два цента:
Поле _id
MongoDB
назначает поле _id
каждому документу и назначает на нем первичный индекс. Существуют способы, с помощью которых мы можем применять и вторичные индексы. По умолчанию MongoDB
создает значения для поля _id
типа ObjectID
. Это значение определено в BSON
spec и структурировано таким образом:
ObjectID (12 байтов HEX string) = Дата (4 байта, значение временной метки, представляющее количество секунд с эпохи Unix) + MAC-адрес (3 байта) + PID (2 байта) + Счетчик (3 байта)