mongodb 是一個開源的,高性能,無模式(或者說是模式自由),使用 c++ 語言編寫的面向文檔的資料庫。正因為 mongodb 是面向文檔的,是以它可以管理類似 json 的文檔集合。又因為資料可以被嵌套到複雜的體系中并保持可以查詢可索引,這樣一來,應用程式便可以以一種更加自然的方式來為資料模組化。
所謂“面向集合”(collenction-orented),意思是資料被分組存儲在資料集中,被稱為一個集合(collenction)。每個集合在資料庫中都有一個唯一的辨別名,并且可以包含無限數目的文檔。集合的概念類似關系型資料庫(rdbms)裡的表(table),不同的是它不需要定義任何模式(schema)。
模式自由(schema-free),意味着對于存儲在mongodb資料庫中的檔案,我們不需要知道它的任何結構定義。如果需要的話,你完全可以把不同結構的檔案存儲在同一個資料庫裡。
存儲在集合中的文檔,被存儲為鍵-值對的形式。鍵用于唯一辨別一個文檔,為字元串類型,而值則可以是各中複雜的檔案類型。我們稱這種存儲形式為bson(binary serialized document format)。
mongodb 把資料存儲在檔案中(預設路徑為:<code>/data/db</code>),為提高效率使用記憶體映射檔案進行管理。mongodb的主要目标是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統的 rdbms 系統(豐富的功能)架起一座橋梁,集兩者的優勢于一身。
根據官方網站的描述,mongo 适合用于以下場景:
網站資料:mongo非常适合實時的插入,更新與查詢,并具備網站實時資料存儲所需的複制及高度伸縮性。
緩存:由于性能很高,mongo也适合作為資訊基礎設施的緩存層。在系統重新開機之後,由mongo搭建的持久化緩存層可以避免下層的資料源過載。
大尺寸,低價值的資料:使用傳統的關系型資料庫存儲一些資料時可能會比較昂貴,在此之前,很多時候程式員往往會選擇傳統的檔案進行存儲。
高伸縮性的場景:mongo非常适合由數十或數百台伺服器組成的資料庫。mongo的路線圖中已經包含對mapreduce引擎的内置支援。
用于對象及json資料的存儲:mongo的bson資料格式非常适合文檔化格式的存儲及查詢。
自然,mongodb 的使用也會有一些限制,例如它不适合:
高度事務性的系統:例如銀行或會計系統。傳統的關系型資料庫目前還是更适用于需要大量原子性複雜事務的應用程式。
傳統的商業智能應用:針對特定問題的bi資料庫會對産生高度優化的查詢方式。對于此類應用,資料倉庫可能是更合适的選擇。
需要sql的問題
mongodb的官網就有下載下傳,根據系統windows還是linux還是别的下載下傳32位還是64位的,然後解壓安裝。
如果你使用的時mac系統,你可以通過 brewhome 來安裝:
解壓完之後進入bin目錄,裡面都是一些可執行檔案,mongo,mongod,mongodump,mongoexport等。
1).啟動和停止mongodb
通過執行mongod來啟動mongodb伺服器:
mongod有很多的配置啟動選項的,可以通過<code>mongod --help</code>來檢視,其中有一些主要的選項:
<code>--dbpath</code>:指定資料目錄,預設是<code>/data/db/</code>。每個mongod程序都需要獨立的目錄,啟動mongod時就會在資料目錄中建立mongod.lock檔案,防止其他mongod程序使用該資料目錄。
<code>--port</code>:指定伺服器監聽的端口,預設是<code>27017</code>。
<code>--fork</code>:以守護程序的方式運作mongodb。
<code>--logpath</code>:指定日志輸出路徑,如果不指定則會在終端輸出。每次啟動都會覆寫原來的日志,如果不想覆寫就要用<code>--logappend</code>選項。
<code>--config</code>:指定配置檔案,加載指令行未指定的各種選項。我們可以講我們需要用到的選項寫在某個檔案中,然後通過該選項來指定這個檔案就不必每次啟動mongod時都要寫。
2).資料備份
a. 資料檔案備份
最簡單的備份就是資料檔案的備份,就是直接指派data/db這個目錄,因為我們前面已經指定了資料目錄就是data/db,那麼mongodb多有的資料都在這裡,但是有個問題就是最新的資料還在緩存中,沒用同步到磁盤,可以先停止shutdownserver()再備份。但是這樣會影響mongodb正常的工作。
b. mongodump和mongorestore
bin 中還有 mongodump 和 mongorestore 兩個可執行檔案,這個是對mongodb的某個資料庫進行備份,可以在mongodb正在運作時進行備份,比如備份test資料庫,然後将備份的資料庫檔案再倒入别的mongodb伺服器上。這種備份的方式備份的不是最新資料,隻是已經寫入mongodb中的資料,可能還有的資料在緩存中沒有寫入,那麼這部分資料就是備份不到的。mongodump和mongorestore也可以通過<code>--help</code>查詢所有選項。
<code>-d</code>是指定資料庫,<code>-o</code>是輸出備份檔案,上面将 test 資料庫備份為 test_db 檔案。
這裡将上面備份出來的 test 資料庫現在重新導入到 temple 資料庫,<code>--drop</code>代表如果有了 temple 資料庫則将其中的所有集合删除,不指定就會和原來 temple 中的集合合并。
c. mongoexport和mongoimport
備份某個資料庫中的某個表,同樣可以通過<code>--help</code>來檢視所有的選項,當然mongoexport也是可以不統計的備份,但是卻不一定是最新資料。
<code>-c</code>表示 collection 集合,上面将 zhihu 庫中的 zh_user 集合備份出來為 zh_user 檔案,然後再導入到 temple 庫中的user集合。
d. sync和鎖
mongodump和mongoexport對都可以不停mongodb伺服器來進行備份,但是卻失去了擷取實時資料的能力,而fsync指令也能在不停mongodb的情況下備份實時資料,它的實作其實就是上鎖,阻止對資料庫的寫入操作,然後将緩沖區的資料寫入磁盤,備份後再解鎖。在這個期間,任何對資料庫的寫入操作都會阻塞,直到鎖被釋放。
mongodb的檔案存儲格式為bson,同json一樣支援往其它文檔對象和數組中再插入文檔對象和數組,同時擴充了json的資料類型.與資料庫打交道的那些應用。例如,json沒有日期類型,這會使得處理本來簡單的日期問題變得非常繁瑣。隻有一種數字類型,沒法區分浮點數和整數,更不能區分32位和64位數字。也沒有辦法表示其他常用類型,如正規表達式或函數。
下面是mongodb的支援的資料類型:
null null用于表示空值或者不存在的字段。 <code>{"x":null}</code>
布爾 布爾類型有兩個值’true’和’false1’。 <code>{"x":true}</code>
32位整數 類型不可用。javascript僅支援64位浮點數,是以32位整數會被自動轉換。
64位整數 不支援這個類型。shell會使用一個特殊的内嵌文檔來顯示64位整數。
64位浮點數 shell中的數字都是這種類型。下面的表示都是浮點數: <code>{"x" : 3.1415926} {"x" : 3}</code>
字元串 utf-8字元串都可表示為字元串類型的資料: <code>{"x" : "foobar"}</code>
符号 不支援這種類型。shell将資料庫裡的符号類型轉換成字元串。
對象id 對象id是文檔的12位元組的唯一id:<code>{"_id":objectid() }</code>
日期 日期類型存儲的是從标準紀元開始的毫秒數。不存儲時區: <code>{"x" : new date()}</code>
正規表達式 文檔中可以包含正規表達式,采用javascript的正規表達式文法:<code>{"x": /foobar/i}</code>
代碼 文檔中還可以包含javascript代碼:<code>{"x": function() { /* …… */ }}</code>
二進制資料 二進制資料可以由任意位元組的串組成。不過shell中無法使用。
最大值 bson包括一個特殊類型,表示可能的最大值。shell中沒有這個類型。
最小值 bson包括一個特殊類型,表示可能的最小值。shell中沒有這個類型。
未定義 文檔中也可以使用未定義類型:<code>{"x":undefined}</code>
數組 值的集合或者清單可以表示成數組:<code>{"x" : ["a", "b", "c"]}</code>
内嵌文檔 文檔可以包含别的文檔,也可以作為值嵌入到父文檔中,資料可以組織得更自然些,不用非得存成扁平結構的:{“x” : {“food” : “noodle”}}
javascript中隻有一種“數字”類型。因為mongodb中有3種數字類型(32位整數、64位整數和64位浮點數),shell必須繞過javascript的限制。預設情況下,shell中的數字都被mongodb當做是雙精度數。這意味着如果你從資料庫中獲得的是一個32位整數,修改文檔後,将文檔存回資料庫的時候,這個整數也被轉換成了浮點數,即便保持這個整數原封不動也會這樣的。是以明智的做法是盡量不要在shell下覆寫整個文檔。
由于mongodb中不同文檔的同一個key的value資料類型可以不同,當我們根據某個key查詢的時候會發生不同資料類型之間的比較。是以mongodb内部設定了資料類型間的大小,順序如下: