1. 程式人生 > >MongoDB的數據類型(四)

MongoDB的數據類型(四)

expr lpad time rip mar serialize 類型轉換 fun oat

JSON

JSON是一種簡單的數據表示方式,它易於理解、易於解析、易於記憶。但從另一方面來說,因為只有null、布爾、數字、字符串、數組和對象這幾種數據類型,所以JSON有一定局限性。例如,JSON沒有日期類型,JSON只有一種數字類型,無法區分浮點數和整數,更別說區分32為和64位數字了。再者,JSON無法表示其他一些通用類型,如正則表達式或函數。

BSON

  BSON(Binary Serialized Document Format)是一種類JSON的二進制形式的存儲格式,簡稱Binary JSON。它和JSON一樣,支持內嵌的文檔對象和數組對象,但是BSON有JSON沒有的一些數據類型,如Date和BinData類型。它支持下面數據類型。每個數據類型對應一個數字,在MongoDB中可以使用$type操作符查看相應的文檔的BSON類型。

類型 對應數字 別名 說明
Double1 1 double
String 2 string
Object 3 object
Array 4 array
Binary data 5 binData
Undefined 6 undefined 棄用
ObjectId 7 objectId
Boolean 8 “bool”
Date 9 “date”
Null 10 “null”
Regular Expression 11 “regex”
DBPointer 12 “dbPointer”
JavaScript 13 “javascript”
Symbol 14 “symbol”
JavaScript(with scope) 15 “javascriptWithScope”
32-bit integer 16 “int”
Timestamp 17 “timestamp”
64-bit integer 18 “long”
Min key -1 “minKey”
Max key 127 “maxKey”

BSON 與 MongoDB 的關系

  BSON是用於存儲MongoDB【文檔】的一種文檔格式。驅動程序在使用【文檔】進行插入、查詢或其他操作時。會先將【文檔】編碼成BSON格式,然後發送給服務器。同樣地,服務器將文檔返回客戶端時,也是以BSON格式進行的。驅動程序先對此BSON進行解碼然後再傳送給客戶端。因此,BSON與MongoDB的關系為:MongoDB利用BSON格式存儲數據和傳輸數據。

基本數據類型  

  null:用於表示控制或者不存在的字段,如:{"x" : null}。

  布爾:只有兩個值true和false。

  32位整數:shell中這個類型不可用,javascript僅支持64位浮點數,所以32位整數會被自動轉換。

  64位整數:shell中這個類型不可用,shell會使用一個特殊的內嵌文檔來顯示64位整數。

  64位浮點數:shell中的數字都是這個類型,{"x" : 3.14}和{"x" : 3}都是浮點數。

    因為javascript只有一種數字類型就是64位浮點型,所以MongoDB中從shell的來的數字都被當做64位浮點型,而MongoDB中支持三種數字類型,所以用shell修改過數據庫中的數據後都會被轉換成64位浮點型。64位整數並不能精確的表示64位浮點型,如果MongoDB中存入了一個64位整數,在shell中查看時,如果能夠表示64位浮點型那就用一個鍵的內置文檔顯示而且這個值是精確的,否則,他會顯示一個多鍵內嵌文檔,表示可能不精確。

    如果是64位整數3,那麽在shell中查詢顯示會是這個樣子:

db.nums.findOne()  
{  
  "_id" : ObjectId("4c0beecfd096a2580fe6fa08"),  
  "myInteger" : {  
    "floatApprox" : 3  
  }  
}

    如果是64位整數9223372036854775807,那麽在shell中查詢顯示會是這個樣子:

db.nums.findOne()  
{  
    "_id" : ObjectId("4c0beecfd096a2580fe6fa08"),  
    "myInteger" : {  
        "floatApprox" : 9223372036854775807,  
        "top" : 2147483647,  
        "bottom" : 4294967295  
    }  
}          

    top和bottom分別表示高32位和低32位。

  註:JavaScript中只有一種“數字”類型。因為MongoDB中有3種數字類型(32位整數、64位整數和64位浮點數),shell必須繞過JavaScript的限制。默認情況下,shell中的數字都被MongoDB當做是雙精度數。這意味著如果你從數據庫中獲得的是一個32位整數,修改文檔後,將文檔存回數據庫的時候,這個整數也被轉換成了浮點數,即便保持這個整數原封不動也會這樣的。所以明智的做法是盡量不要在shell下覆蓋整個文檔。

  字符串:UTF-8字符串都可表示為字符串類型的數據,如:{"name" : "Mary"}。

  符號:shell不支持這種類型,shell會將數據庫中的符號類型轉換成字符串。

  對象id:對象id是文檔的12字節的唯一ID。

    MongoDB中存儲的文檔必須有一個鍵"_id",這個鍵可以是任意類型的,默認是ObjectId對象,當我們存入文檔時不指定該鍵,那麽MongoDB會自動添加這樣一個鍵值對,這個值是唯一標識,ObjectId使用12字節的存儲空間。

  日期:日期類型存儲的是從標準紀元開始的毫秒數,不存儲時區,如:{"x" : new Date()}。

    javascript中Date對象用作MongoDB的日期類型,創建日期對象要用new Date()而不是Date(),返回的是對日期的字符串表示,而不是真正的Date對象。

  正則表達式:文檔中可以包含正則表達式,采用javascript的正則表達式語法,如:{"x" : /foobar/i}。

  代碼:文檔中還可以包含javascript代碼,如:{"x" : function(){/*...*/}}。

  二進制數據:二進制數據可以由任意字節的串組成,不過shell中無法使用。

  最大值:BSON包括一個特殊類型,表示可能的最大值,shell中沒有這個類型。

  最小值:BSON包括一個特殊類型,表示可能的最小值,shell中沒有這個類型。

  未定義:文檔中也可以使用未定義類型,如:{"x" : undefined}

  數組:值的集合或者列表可以表示成數組,數組中的元素可以是不同類型的數據,如:{"x" : ["a", "b", "c", 20]}。

  內嵌文檔:文檔可以包含別的文檔,也可以作為值嵌入到父文檔中,如:{"x" : {"foo" : "bar"}}。

  對象Id:對象id是一個12字節的字符串,是文檔的唯一標識,{“x”: objectId() }。

  二進制數據:二進制數據是一個任意字節的字符串。它不能直接在shell中使用。如果要將非utf-字符保存到數據庫中,二進制數據是唯一的方式。

  代碼:查詢和文檔中可以包括任何JavaScript代碼,{“x”:function(){/*…*/}}

  用的情況:布爾,數字,字符串,日期,數組和內嵌文檔是用的最多的。

MongoDB的數據類型(四)