MongoDB(BSON)資料類型
除了基本的JSON類型:string,integer,boolean,double,null,array和object,mongo還使用了特殊的資料類型。這些類型包括date,object id,binary data,regular expression 和code。每一個驅動都以特定語言的方式實現了這些類型,查看你的驅動的文檔來擷取詳細資料。
從shell中檢查資料類型
在shell中,浮點型和整型被視為是標準javascript數字,因此不能將兩者區分開。
> // v1.8+ shell
> x
{
"_id" : ObjectId("4dcd3ebc9278000000005158"),
"d" : ISODate("2011-05-13T14:22:46.777Z"),
"b" : BinData(0,""),
"c" : "aa",
"n" : 3,
"e" : [ ],
"n2" : NumberLong(33)
}
> x.d instanceof Date
true
> x.b instanceof BinData
true
> typeof x
object
> typeof x.b
object
> typeof x.n
number
> typeof x.n
number
> typeof x.n2
object
> x.n2 instanceof NumberLong
true
> typeof x.c
string
時間戳記資料類型
在mongodb中,BSON包含了有著特殊語義的時間戳記資料類型。
時間戳記被儲存為64位,並在同一個mongod中保證唯一性。前面的32位是time_t值(從UTC時間到當前的秒數)。後面的32位是同一秒內操作的遞增的順序值。
mongodb對複製組oplog中欄位“ts”使用時間戳資料類型作為“OpTimes”.
當為null時,時間戳記有特殊語義。如果為null,並且時間戳記是對象的前兩個欄位之一,時間戳記會自動被轉換為一個唯一的值。(它必須是前兩個頂級欄位之一是考慮到效能原因;整個文檔未掃描時間戳記。)
下面是一個mongo shell中的例子(v1.7.5或者更高)。
> // not one of the first 2 fields
> db.foo.insert( { x : 1, y : new Timestamp() } )
> db.foo.find()
{ "_id" : ObjectId("4d1d4ce78b1a04eeb294c098"), "x" : 1, "y" : { "t" : 0, "i" : 0 } }
> // in first 2 fields, auto fill of value works
> db.foo.drop()
> db.foo.insert( { y : new Timestamp(), x : 3 } )
> // the shell displays timestamps as { t : ..., i : ... } where t is the time
> // component and i is the ordinal component
> db.foo.find()
{ "_id" : ObjectId("4d1d4cfd8b1a04eeb294c099"), "y" : { "t" : 1293765885000, "i" : 1 }, "x" : 3 }
> db.foo.drop()
> for( var i = 0; i < 10; i++ ) db.foo.insert({y:new Timestamp(), x : i})
> db.foo.find()
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c09a"), "y" : { "t" : 1293765911000, "i" : 1 }, "x" : 0 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c09b"), "y" : { "t" : 1293765911000, "i" : 2 }, "x" : 1 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c09c"), "y" : { "t" : 1293765911000, "i" : 3 }, "x" : 2 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c09d"), "y" : { "t" : 1293765911000, "i" : 4 }, "x" : 3 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c09e"), "y" : { "t" : 1293765911000, "i" : 5 }, "x" : 4 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c09f"), "y" : { "t" : 1293765911000, "i" : 6 }, "x" : 5 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c0a0"), "y" : { "t" : 1293765911000, "i" : 7 }, "x" : 6 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c0a1"), "y" : { "t" : 1293765911000, "i" : 8 }, "x" : 7 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c0a2"), "y" : { "t" : 1293765911000, "i" : 9 }, "x" : 8 }
{ "_id" : ObjectId("4d1d4d178b1a04eeb294c0a3"), "y" : { "t" : 1293765911000, "i" : 10 }, "x" : 9 }
>
UTC DateTime 資料類型
按照BSON Date/Time資料類型被稱為UTC DateTime 。(這裡還有另一個時間戳記資料類型,但是它是mongodb的一個特殊內部類型並且你不應該使用)。UTC DateTime將自Unix紀元(Jan 1, 1970)以來的毫秒數儲存為一個64位整型資料。這個整數是有符號的,所以早於1970的時間都會被儲存為負數。
但是,在版本1.9.1以前的mongodb將DateTime數錯誤的解析為不帶正負號的整數,這影響到了排序,範圍查詢,DateTime類型的欄位的索引。當升級的時候索引不會重建。因此如果你使用低於版本1.9.1的程式在DateTime類型的欄位上面建立了索引,然後升級到高於或等於版本1.9.1的程式後,有的索引將還是把日期按不帶正負號的整數排序(早於日期1970的會排到晚於或等於日期1970的之後),這會影響到排序和範圍查詢。要解決這個問題,你必須丟棄並重建你的索引。
國際化的字串
mongodb支援UTF-8格式的字串儲存到對象和查詢中。(特別的,BSON的字串是UTF-8的.)
通常來說,每種語言的驅動在序列化和反序號BSON時會將該語言的字串轉換為UTF-8。例如,java驅動在序列化時將java unicode字串轉換為UTF-8.
這意味著在大多數場合你可以高效的儲存大多數的國際間的字元到mongodb的字串。一些提醒:
- mongodbRegex查詢支援在Regex字串中使用UTF-8.
- 當前,在一個字串上進行sort()會使用strcmp:排序次序可能是合理的但在國際間資料上面不是完全正確的。將來的mongodb版本可能會支援完全UTF-8排序次序。