我看到三個主要的可能性爲MongoDB中存儲布爾信息:我應該如何在mongodb中存儲布爾值?
- 0或1作爲字符串
- 0或1作爲編號
- True或False爲布爾
在使用存儲空間和查詢速度方面,每種方法有哪些優缺點?
我看到三個主要的可能性爲MongoDB中存儲布爾信息:我應該如何在mongodb中存儲布爾值?
在使用存儲空間和查詢速度方面,每種方法有哪些優缺點?
Boolean
是BSON(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()
之間的差異是字段值的表示。
如果你有幾個布爾值,比使用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
正如在我的回答中指出的,基本對象的BSON大小是8個字節(包括單個字符字段名稱,但不包括值)。布爾值是1個字節。您當然可以使用位掩碼將多個布爾值打包成單個整數值,但這確實會影響索引效率和模式可讀性,從而節省幾個字節的空間。在MongoDB 3.4中,位掩碼查詢不能使用索引(upvote/watch [SERVER-24749](https://jira.mongodb.org/browse/SERVER-24749)),因此如果您計劃包含這些值字段在索引中。 – Stennie 2017-04-02 00:41:16
爲什麼要使用_anything_而不是布爾型('true' /'false')? – 2014-12-08 03:53:54
wellllllllllllllllllllll。不言而喻這是一個伎倆或對待。您可以將null或未定義的值視爲-1,而不是true/false。因此是一個數字。但是可以使用mongodb中存在的$存在未定義的值。所以沒有grt優勢。除非你可以索引undefined .... – 2014-12-08 05:02:22