mongodb指南(翻譯)(十二) – developer zone – 資料類型和約定(一)

來源:互聯網
上載者:User

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排序次序。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.