2014-12-08 98 views
14

我看到三个主要的可能性为MongoDB中存储布尔信息:我应该如何在mongodb中存储布尔值?

  1. 0或1作为字符串
  2. 0或1作为编号
  3. True或False为布尔

在使用存储空间和查询速度方面,每种方法有哪些优缺点?

+3

为什么要使用_anything_而不是布尔型('true' /'false')? – 2014-12-08 03:53:54

+0

wellllllllllllllllllllll。不言而喻这是一个伎俩或对待。您可以将null或未定义的值视为-1,而不是true/false。因此是一个数字。但是可以使用mongodb中存在的$存在未定义的值。所以没有grt优势。除非你可以索引undefined .... – 2014-12-08 05:02:22

回答

23

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

例如,在一个的MongoDB find()查询"1"串将不匹配的1数值或true的布尔值。如果你想存储布尔值,绝对使用布尔类型。

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

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 2017-04-02 00:41:16