mongodb_資料型別(null/字串/數字/日期/內嵌文件/陣列等)
MongoDB的文件類似於JSON,JSON只是一種簡單的表示資料的方式,只包含了6種資料型別(null、布林、數字、字串、陣列及物件).
JSON的資料型別的侷限性:
1.無日期型別,對日期型的處理較為繁瑣
2.無法區分浮點數和整數、32位和64位
3.其他型別表示侷限 如函式、正則式等
Mongodb使用BSON(Binary JSON)來組織資料,BSON還提供日期、32位數字、64位數字等型別。下面為在mongodb shell中這些型別在文件中是如何表示:
1、null 用於表示空值或者不存在的欄位。
{"name":null}
2.布林 布林型別、即true和false
{"flag":true}/{"flag":false}
3.數字 mongodb中分32位整數、64位整數、64位浮點數
>javascript只支援64位浮點數,shell中對32位的整數會進行自動的轉換:
預設情況下,shell中的數字被mongdb當做是雙精度。若從資料庫中獲取一個32位整數,修改了文件後在將文件儲存到資料庫的時候,這個整數已被轉換成了浮點數(整數不變也會轉換)。
>shell中會用內嵌文件的方式顯示64位整數:
數字智慧表示為雙精度數(64位浮點數)的另一個問題是,有些64位的整數並不能精確的表示64位浮點數。因此要是存入了一個64位整數然後在shell中檢視,它顯示一個內嵌的文件,表示可能不準確。
如:
插入文件{"name":"apple","num":5},其中"num"設定為64位整數5.
檢視如下:
{ "_id" : ObjectId("5000f7af32e3988ad237a202"), "name" : "apple", "num" : {"floatApprox" : 5} }
===================================
===================================
這裡並沒有發現這種情況,可能是我的系統是32位的吧
===================================
===================================
插入文件{"name":"orange","num":9223372036854775807}
檢視如下:
{ "_id" : ObjectId("5000f7af32e3988ad237a203"), "name" : "apple", "num" : {"floatApprox" : 9223372036854776000 ,"top" : 2147483647 , "bottom" : 4294967295} }
===================================
===================================
這裡同樣輸入了 9223372036854776000也沒有發現輸出的情況
===================================
===================================
{"name":"apple","num":5}
{"name":"orange","num":9223372036854775807}
{"name":"peach","num":922337203685477580743254354565678678998935345}
>db.a.find()
{ "_id" : ObjectId("5000f7af32e3988ad237a204"), "name" : "apple", "num" : 5 }
{ "_id" : ObjectId("5000f87432e3988ad237a205"), "name" : "orange", "num" : 9223372036854776000 }
{ "_id" : ObjectId("5000fbd232e3988ad237a206"), "name" : "peach", "num" : 9.223372036854776e+44 }
===================================
===================================
我這裡情況基本一樣,存入過大數量也會變成浮點數
64位浮點數:
{"num":3.14}/{"num":3}
===================================
===================================
存是可以,但後面的精度如果過高的話,會有丟失情況且
4.字串 UTF-8字串都可以表示為字串型別的資料
{"name":"orange"}
5.符號 shell中不支援,並將資料庫裡的符號型別都轉換成字串
6.物件id是文件的12位元組的唯一ID
{"x":Object()}
Mongodb中儲存的(同一個集合內)文件必須有,只有唯一的“_id”鍵。值可為任意型別,必須保證其唯一性,預設為ObjectId物件。至於mongodb為什麼用ObjectId物件,以及它有什麼好處等請翻閱相關資料。
下面是ObjectId的構成:
ObjectId使用12位元組的儲存空間,每個位元組兩位十六進位制數字,是一個24位的字串。12位元組按照如下方式生成:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
時間戳 | 機器碼 | PID | 計數器
-----------------------------------------------
>時間戳:從標準的紀元開始的時間戳,單位為秒。
>機器碼:所在主機的唯一標示符,通常為機器主機名的雜湊值。
>PID:產生ObjectId的程式標示符。
>計數器:自動增加計數器,同一秒最多允許每個程式擁有256的3次方(16777216)個不同的ObjectId。
文件的"_id"鍵:
1.插入文件的時候,沒有該鍵,系統自動建立一個。
2.mongodb伺服器可自動建立,通常在客戶端由驅動程式完成:
>減少資料庫擴充套件的負擔
>驅動程式提供豐富的API,可返回ObjectId,也可插入文件;若有伺服器生成的話,驅動程式需單獨的查詢來確定插入的文件中的"_id"值。
7.日期型 儲存的是從標準紀元開始的毫秒數,不儲存時區。
{"name":"xx","date":new Date()} 本機檢視:{ "_id" : ObjectId("5001047632e3988ad237a206"), "name" : "xx", "date" : ISODate("2012-07-14T05:32:38.189Z") }
8.正則式 文件中可以包含正規表示式,採用javascript的正規表示式語法
{"regex":/[0-9]/g}
9.程式碼或者函式 javascript程式碼(mongodb中值直接儲存到資料庫,不對值進行執行,因此不存在安全問題)
{"setName":function(){var name="jk";alert(name)}}
===================================
===================================
這個function(){val name="jk"; alert(name)} 並沒有插入成功到文件中,提示錯誤
10.二進位制數 可以由任意位元組的串組成。shell中無法使用。
11.最大值 BSON包括一個特殊型別,表示可能的最大值。shell沒有這個型別。
12.最小值 BSON包括一個特殊型別,表示可能的最小值。shell沒有這個型別。
13.未定義(undefined) 文件中也可以使用未定義型別
{"name":undefined}
===================================
===================================
undefined存入資料庫後,值變為了null
14.陣列 值的集合或者列表可以表示成陣列
{"name":["s","d","f"]}
15.內嵌文件 文件可以包含文件,作為值嵌入到父文件中
{"sch" : "s"
"catl" : {
"c1" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
"c2" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
"c3" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
}
}
從物件導向的角度來理解文件,文件就是個物件,文件裡面的key/value就是屬性和屬性值。
JSON的資料型別的侷限性:
1.無日期型別,對日期型的處理較為繁瑣
2.無法區分浮點數和整數、32位和64位
3.其他型別表示侷限 如函式、正則式等
Mongodb使用BSON(Binary JSON)來組織資料,BSON還提供日期、32位數字、64位數字等型別。下面為在mongodb shell中這些型別在文件中是如何表示:
1、null 用於表示空值或者不存在的欄位。
{"name":null}
2.布林 布林型別、即true和false
{"flag":true}/{"flag":false}
3.數字 mongodb中分32位整數、64位整數、64位浮點數
>javascript只支援64位浮點數,shell中對32位的整數會進行自動的轉換:
預設情況下,shell中的數字被mongdb當做是雙精度。若從資料庫中獲取一個32位整數,修改了文件後在將文件儲存到資料庫的時候,這個整數已被轉換成了浮點數(整數不變也會轉換)。
>shell中會用內嵌文件的方式顯示64位整數:
數字智慧表示為雙精度數(64位浮點數)的另一個問題是,有些64位的整數並不能精確的表示64位浮點數。因此要是存入了一個64位整數然後在shell中檢視,它顯示一個內嵌的文件,表示可能不準確。
如:
插入文件{"name":"apple","num":5},其中"num"設定為64位整數5.
檢視如下:
{ "_id" : ObjectId("5000f7af32e3988ad237a202"), "name" : "apple", "num" : {"floatApprox" : 5} }
===================================
===================================
這裡並沒有發現這種情況,可能是我的系統是32位的吧
===================================
===================================
插入文件{"name":"orange","num":9223372036854775807}
檢視如下:
{ "_id" : ObjectId("5000f7af32e3988ad237a203"), "name" : "apple", "num" : {"floatApprox" : 9223372036854776000 ,"top" : 2147483647 , "bottom" : 4294967295} }
===================================
===================================
這裡同樣輸入了 9223372036854776000也沒有發現輸出的情況
===================================
===================================
{"name":"apple","num":5}
{"name":"orange","num":9223372036854775807}
{"name":"peach","num":922337203685477580743254354565678678998935345}
>db.a.find()
{ "_id" : ObjectId("5000f7af32e3988ad237a204"), "name" : "apple", "num" : 5 }
{ "_id" : ObjectId("5000f87432e3988ad237a205"), "name" : "orange", "num" : 9223372036854776000 }
{ "_id" : ObjectId("5000fbd232e3988ad237a206"), "name" : "peach", "num" : 9.223372036854776e+44 }
===================================
===================================
我這裡情況基本一樣,存入過大數量也會變成浮點數
64位浮點數:
{"num":3.14}/{"num":3}
===================================
===================================
存是可以,但後面的精度如果過高的話,會有丟失情況且
4.字串 UTF-8字串都可以表示為字串型別的資料
{"name":"orange"}
5.符號 shell中不支援,並將資料庫裡的符號型別都轉換成字串
6.物件id是文件的12位元組的唯一ID
{"x":Object()}
Mongodb中儲存的(同一個集合內)文件必須有,只有唯一的“_id”鍵。值可為任意型別,必須保證其唯一性,預設為ObjectId物件。至於mongodb為什麼用ObjectId物件,以及它有什麼好處等請翻閱相關資料。
下面是ObjectId的構成:
ObjectId使用12位元組的儲存空間,每個位元組兩位十六進位制數字,是一個24位的字串。12位元組按照如下方式生成:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
時間戳 | 機器碼 | PID | 計數器
-----------------------------------------------
>時間戳:從標準的紀元開始的時間戳,單位為秒。
>機器碼:所在主機的唯一標示符,通常為機器主機名的雜湊值。
>PID:產生ObjectId的程式標示符。
>計數器:自動增加計數器,同一秒最多允許每個程式擁有256的3次方(16777216)個不同的ObjectId。
文件的"_id"鍵:
1.插入文件的時候,沒有該鍵,系統自動建立一個。
2.mongodb伺服器可自動建立,通常在客戶端由驅動程式完成:
>減少資料庫擴充套件的負擔
>驅動程式提供豐富的API,可返回ObjectId,也可插入文件;若有伺服器生成的話,驅動程式需單獨的查詢來確定插入的文件中的"_id"值。
7.日期型 儲存的是從標準紀元開始的毫秒數,不儲存時區。
{"name":"xx","date":new Date()} 本機檢視:{ "_id" : ObjectId("5001047632e3988ad237a206"), "name" : "xx", "date" : ISODate("2012-07-14T05:32:38.189Z") }
8.正則式 文件中可以包含正規表示式,採用javascript的正規表示式語法
{"regex":/[0-9]/g}
9.程式碼或者函式 javascript程式碼(mongodb中值直接儲存到資料庫,不對值進行執行,因此不存在安全問題)
{"setName":function(){var name="jk";alert(name)}}
===================================
===================================
這個function(){val name="jk"; alert(name)} 並沒有插入成功到文件中,提示錯誤
10.二進位制數 可以由任意位元組的串組成。shell中無法使用。
11.最大值 BSON包括一個特殊型別,表示可能的最大值。shell沒有這個型別。
12.最小值 BSON包括一個特殊型別,表示可能的最小值。shell沒有這個型別。
13.未定義(undefined) 文件中也可以使用未定義型別
{"name":undefined}
===================================
===================================
undefined存入資料庫後,值變為了null
14.陣列 值的集合或者列表可以表示成陣列
{"name":["s","d","f"]}
15.內嵌文件 文件可以包含文件,作為值嵌入到父文件中
{"sch" : "s"
"catl" : {
"c1" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
"c2" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
"c3" : {"cls1" : "cs1","cls2" : "cs2","cls3" : "cs3"}
}
}
從物件導向的角度來理解文件,文件就是個物件,文件裡面的key/value就是屬性和屬性值。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2083123/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- toLocaleString 將字串、日期、數字、陣列等物件的本地化字串陣列物件
- MongoDB查詢(陣列、內嵌文件和$where)MongoDB陣列
- 迴圈語句+資料型別的內建方法(數字,字串)資料型別字串
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- 字串型別數字order by字串型別
- php資料型別之陣列PHP資料型別陣列
- java之資料型別與陣列Java資料型別陣列
- 1.1.1python基本資料型別之數字和字串Python資料型別字串
- NULL的資料型別(二)Null資料型別
- Go 常見資料型別-01陣列Go資料型別陣列
- 【C++】構造資料型別--陣列C++資料型別陣列
- javascript數字和字串資料型別轉換簡單介紹JavaScript字串資料型別
- 資料轉換-整數字節陣列陣列
- Mongodb內嵌陣列的完全匹配查詢MongoDB陣列
- mysql 5.7 json 型別 json 陣列型別 普通字串型別 10w資料 查詢速度差異MySqlJSON型別陣列字串
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- NumPy 陣列切片及資料型別介紹陣列資料型別
- Golang 基礎-資料型別-陣列和切片Golang資料型別陣列
- 基本資料型別與字串型別資料型別字串
- 字串、數值 等型別的相互 安全轉換字串型別
- MongoDB查詢內嵌文件MongoDB
- 【資料結構與演算法】字串匹配(字尾陣列)資料結構演算法字串匹配陣列
- 【.Net】從字串陣列中尋找數字的元素字串陣列
- js資料型別判斷和陣列判斷JS資料型別陣列
- TypeScript 陣列型別TypeScript陣列型別
- js陣列型別JS陣列型別
- Python標準資料型別-數字Python資料型別
- 【MySQL資料型別2之--日期時間型別】MySql資料型別
- Python資料型別(數字,字串,[列表],(元組),{字典:字典值},{列表,列表2})Python資料型別字串
- PHP資料型別轉換(字元轉數字,數字轉字元)PHP資料型別字元
- 資料型別之字串篇資料型別字串
- 基本資料型別之字串資料型別字串
- 陣列轉json後的資料型別問題陣列JSON資料型別
- Numpy學習-Task01-資料型別&陣列建立資料型別陣列
- Python基礎:資料型別-數字(5)Python資料型別
- JavaScript基本資料型別之undefined和nullJavaScript資料型別UndefinedNull
- 為什麼使用型別化陣列來進行位元組操作而不是普通的 javascript 數字陣列型別陣列JavaScript
- systemtap 探祕(三)- 型別、變數和陣列型別變數陣列