Что означает "0" в MongoDB BinData (0, "e8MEnzZoFyMmD7WSHdNrFJyEk8M =" )?

Среда MongoDB печатает двоичные данные в виде строки в кодировке Base64, завернутой в то, что выглядит как вызов функции:

"_id" : BinData(0,"e8MEnzZoFyMmD7WSHdNrFJyEk8M=")

Что означает "0"?

Ответ 1

http://docs.mongodb.org/manual/reference/mongodb-extended-json/#binary

Тип данных BSON BinData представлен через класс BinData в оболочке. Запустите help misc для получения дополнительной информации.

> new BinData(2, "1234")
BinData(2,"1234")

из оболочки

help misc
b = new BinData(subtype,base64str)  create a BSON BinData value

0 в вашем случае есть подтип BSON

http://bsonspec.org/#/specification

binary  ::=   int32 subtype (byte*)   Binary - The int32 is the number of bytes in the (byte*).
subtype ::=   "\x00"  Generic binary subtype
  |   "\x01"  Function
  |   "\x02"  Binary (Old)
  |   "\x03"  UUID (Old)
  |   "\x04"  UUID
  |   "\x05"  MD5
  |   "\x80"  User defined

Аналогичный вопрос в этой теме

http://groups.google.com/group/mongodb-dev/browse_thread/thread/1965aa234aa3ef1e

Ответ 2

Macrolinux прав, но вы должны быть осторожны с его примером, поскольку он будет работать, но случайно.

Первый аргумент BinData() - двоичный подтип BSON, который, как уже упоминалось, является одним из следующих:

generic:  \x00 (0)
function: \x01 (1)
old:      \x02 (2)
uuid_old: \x03 (3)
uuid:     \x04 (4)
md5:      \x05 (5)
user:     \x80 (128)

Это просто помощники, так что десериализатор может интерпретировать двоичные данные по-разному в зависимости от того, что эти байты представляют кроме для подтипа 2, который похож на общий подтип, но сохраняет int32, представляющий длину байтовый массив как первые 4 байта данных.

Теперь, чтобы понять, почему пример неверен, вы заметите, что вызов BinData (2, "1234" ) не хранит двоичный файл, представляющий строку "1234", по двум причинам:

  • Функция BinData интерпретирует эту строку как строку с кодировкой base64.
  • Тип 2 потребует, чтобы первые 4 байта были int32, содержащими длину массива байтов.

Для получения дополнительной информации см. bsonspec.org.

Ответ 3

Я считаю, что они соответствуют подтекстам BSON:

подтип:: = "\ x00" Двоичный/Общий     | Функция "\ x01"     | "\ x02" Двоичный (старый)     | "\ x03" UUID     | "\ x05" MD5     | "\ x80" Определено пользователем

Глядя на это, кажется, что 0 почти всегда является правильным выбором.