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

Как сохранить логические значения в mongodb?

Я вижу три основные возможности для хранения булевой информации в mongodb:

  • 0 или 1 как строка
  • 0 или 1 как номер
  • True или False как логическое

Каковы преимущества/недостатки каждого метода с точки зрения используемого пространства хранения и скорости запросов?

4b9b3361

Ответ 1

Boolean - это собственный тип поля в BSON (формат хранилища на стороне сервера MongoDB, также известный как "Binary JSON" ). Булевы используют меньше памяти, чем целое число или строку, и избегают любых неожиданных побочных эффектов сравнения.

Например, в запросе MongoDB find() строка "1" не будет соответствовать числовому значению 1 или логическому значению true. Если вы хотите сохранить логические значения, определенно используйте булевский тип.

Сравнивая размер BSON (в байтах) в оболочке mongo для полноты:

// Number (JavaScript double) - 8 bytes
> var foo = { a: 1 }
> Object.bsonsize(foo)
16

// UTF-8 String - 6 bytes
> var foo = { a: '1'}
> Object.bsonsize(foo)
14

// 32-bit int - 4 bytes
> var foo = { a: NumberInt(1)}
> Object.bsonsize(foo)
12

// Boolean - 1 byte
> var foo = { a: true}
> Object.bsonsize(foo)
9

Примечание. Базовый размер объекта JSON в приведенных выше примерах (не считая значений полей) составляет 8 байтов, поэтому разница между сообщенным Object.bsonsize() является представлением значения поля.

Ответ 2

Если у вас есть несколько логических значений, то может быть хорошо использовать BSON, встроенный в boolean. Но, как видно ниже, каждый логический размер составляет 4 байта. Поэтому, если ваши данные очень малы (по сравнению с дополнительными 4 байтами) и/или у вас много логических значений, вам может быть лучше использовать целочисленное растровое изображение с побитовые операции.

> var foo = {}
> Object.bsonsize(foo)
5
> foo.a = true
true
> Object.bsonsize(foo)
9
> foo.b = true
true
> Object.bsonsize(foo)
13