Пытаясь вручную запросить объекты в MongoDB с использованием ObjectID, я обнаружил проблему в драйвере mongodb. Интерпретация частей BSON ObjectId кажется неправильной. Я пытаюсь исправить это, но не могу найти подходящую спецификацию, чтобы все исправить.

В документации mongodb objectId определен как 12 байт:

* a 4-byte value representing the seconds since the Unix epoch,
* a 3-byte machine identifier,
* a 2-byte process id, and
* a 3-byte counter, starting with a random value

В сети я нахожу упоминания о

"Note that the timestamp and counter fields must be stored big endian unlike the rest of BSON."

Но я не могу найти его источник. Это имеет смысл, поскольку идентификаторы, которые я вижу в mongo, действительно имеют прямой порядок байтов для метки времени. Большинство идентификаторов объектов имеют в основном нулевые значения, поэтому их трудно вычислить. Моя проблема состоит в том, чтобы найти источник этого определения с прямым порядком байтов, и если это действительно так,

* time is big-endian
* machine id is little-endian
* process id is little-endian
* counter is big-endian
1
Norbert Hartl 8 Май 2014 в 14:44

2 ответа

Лучший ответ

Глядя на исходный код драйвера Go (который люди MongoDB хвалили как наиболее продвинутый и хорошо написанный драйвер) становится ясно, что все поля в ObjectID хранятся с прямым порядком байтов:

http://bazaar.launchpad.net/+branch/mgo/v2/view/head:/bson/bson.go#L295

Его цель, безусловно, состоит в том, чтобы иметь возможность сортировать идентификаторы ObjectID в лексикографическом порядке (побайтно) и отображать числовые значения по порядку.

Идентификатор машины рассматривается как непрозрачный 3-байтовый массив, поэтому не обязательно в каком-либо порядке.

0
Tobia 11 Сен 2014 в 09:35