上篇文章咱們介紹了MongoDB的最基本的增刪改查操做,也介紹了一些基礎的概念,MongoDB中每條記錄稱做一個文檔,這個文檔和咱們平時用的JSON有點像,但也不徹底同樣。JSON是一種輕量級的數據交換格式。簡潔和清晰的層次結構使得JSON成爲理想的數據交換語言,JSON易於閱讀和編寫,同時也易於機器解析和生成,並有效地提高網絡傳輸效率,可是JSON也有它的侷限性,好比它只有null、布爾、數字、字符串、數組和對象這幾種數據類型,沒有日期類型,只有一種數字類型,沒法區分浮點數和整數,也無法表示正則表達式或者函數。因爲這些侷限性,BSON閃亮登場啦,BSON是一種類JSON的二進制形式的存儲格式,簡稱Binary JSON,它和JSON同樣,支持內嵌的文檔對象和數組對象,可是BSON有JSON沒有的一些數據類型,如Date和BinData類型,MongoDB使用BSON作爲文檔數據存儲和網絡傳輸格式。本文咱們就來講說MongoDB中都支持哪些數據類型,其實也是來看看BSON有哪些好玩的地方。 正則表達式
本文是MongoDB系列的第三篇文章,瞭解前面的文章有助於更好的理解本文:shell
1.Linux上安裝MongoDB
2.MongoDB基本操做數據庫
shell默認使用64位浮點型數值,以下:數組
db.sang_collec.insert({x:3.1415926}) db.sang_collec.insert({x:3})
對於整型值,咱們可使用NumberInt或者NumberLong表示,以下:網絡
db.sang_collec.insert({x:NumberInt(10)}) db.sang_collec.insert({x:NumberLong(12)})
字符串也能夠直接存儲,以下:分佈式
db.sang_collec.insert({x:"hello MongoDB!"})
正則表達式主要用在查詢裏邊,查詢時咱們可使用正則表達式,語法和JavaScript中正則表達式的語法相同,好比查詢全部key爲x,value以hello開始的文檔且不區分大小寫:函數
db.sang_collec.find({x:/^(hello)(.[a-zA-Z0-9])+/i})
數組同樣也是被支持的,以下:spa
db.sang_collec.insert({x:[1,2,3,4,new Date()]})
數組中的數據類型能夠是多種多樣的。設計
MongoDB支持Date類型的數據,能夠直接new一個Date對象,以下:code
db.sang_collec.insert({x:new Date()})
一個文檔也能夠做爲另外一個文檔的value,這個其實很好理解,以下:
db.sang_collect.insert({name:"三國演義",author:{name:"羅貫中",age:99}});
書有一個屬性是做者,做者又有name,年齡等屬性。
咱們在前面提到過,咱們每次插入一條數據系統都會自動幫咱們插入一個_id
鍵,這個鍵的值不能夠重複,它能夠是任何類型的,咱們也能夠手動的插入,默認狀況下它的數據類型是ObjectId,因爲MongoDB在設計之初就是用做分佈式數據庫,因此使用ObjectId能夠避免不一樣數據庫中_id
的重複(若是使用自增的方式在分佈式系統中就會出現重複的_id
的值),這個特色有點相似於Git中的版本號和Svn中版本號的區別。
ObjectId使用12字節的存儲空間,每一個字節能夠存儲兩個十六進制數字,因此一共能夠存儲24個十六進制數字組成的字符串,在這24個字符串中,前8位表示時間戳,接下來6位是一個機器碼,接下來4位表示進程id,最後6位表示計數器。
MongoDB中也能夠存儲二進制數據,不過這種狀況並很少,二進制數據的存儲不能在shell中操做,咱們在後面的代碼中會介紹這種存儲方式。
文檔中也能夠包括JavaScript代碼,以下:
db.sang_collect.insert({x:function f1(a,b){return a+b;}});
好了,MongoDB的數據類型咱們就先介紹這麼多,這裏只是作一個大體的瞭解,後文咱們還會再詳細的說到這些東西的詳細使用方式。小夥伴們有問題歡迎留言討論。
參考資料:
1.《MongoDB權威指南第2版》
更多資料請關注公衆號: