2014-12-08 2 views
14

Я вижу три основные возможности для хранения булево информации в MongoDB:Как хранить логические значения в mongodb?

  1. 0 или 1 в виде строки
  2. 0 или 1 в качестве числа
  3. Правда или Ложь как логическое

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

+3

Почему вы используете _anything_, кроме логического ('true' /' false')? –

+0

wellllllllllllllllllll. не говоря о том, что это трюк или удовольствие. вы можете рассматривать значение null или undefined как -1, противоположное true/false. следовательно, число. но можно найти неопределенные значения, используя $ существует в mongodb. так что никакого преимущества grt. за исключением того, что вы можете индексировать undefined .... –

ответ

23

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

Например, в запросе find() MongoDB строка "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() является представлением значения поля.

0

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

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

Как отмечено в моем ответе, размер BSON базового объекта составляет 8 байтов (включая одно имя поля символа, но не значения); логическое значение 1 байт. Вы можете, конечно, упаковать несколько булевых элементов в одно целое значение, используя битмаски, но это делает эффективность индекса торговли и доступность схемы для потенциальной экономии нескольких байтов. Как и в MongoDB 3.4, битмаксные запросы не могут использовать индексы (upvote/watch [SERVER-24749] (https://jira.mongodb.org/browse/SERVER-24749)), поэтому логические значения также рекомендуются, если вы планируете включить эти поля в индексе. – Stennie

Смежные вопросы