2014-12-08 102 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