我应该如何在mongodb中存储布尔值?

时间:2014-12-08 03:52:23

标签: mongodb mongoose

我看到在mongodb中存储布尔信息的三种主要可能性:

  1. 0或1作为字符串
  2. 0或1作为数字
  3. 作为布尔值的真或假
  4. 每种方法在使用的存储空间和查询速度方面有哪些优点/缺点?

2 个答案:

答案 0 :(得分:30)

BooleanBSON中的本机字段类型(MongoDB的服务器端存储格式,又名“Binary JSON”)。布尔值比整数或字符串使用更少的存储空间,并避免任何意外的比较副作用。

例如,在MongoDB find()查询中,"1"的字符串与1的数值或布尔值true不匹配。如果要存储布尔值,请务必使用布尔类型。

比较mongo shell中的BSON大小(以字节为单位)是否完整:

// 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()之间的差异是字段值的表示。

答案 1 :(得分: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