共用方式為


本文章是由機器翻譯。

程式設計師雜談

使用 MongoDB 投入 NoSQL 的懷抱

Ted Neward

下載程式碼範例

透過過去十年或自 Microsoft.NET Framework 中 2000年和 2002,其第一次發行的公告後的操作.NET 開發人員有勤奮趕上 Microsoft 已經在它們擲回的所有新事物。 而且如果如的 wasn’t 夠 「 社群 」 — 這表示這兩個開發人員每日和那些人 don’t 上使用.NET — 已消失,並且建立更多事項來填入 Microsoft doesn’t 涵蓋的漏洞 — 或只是建立混亂和混淆 (您挑選)。

從外部的 Microsoft 從社群浮現那些 「 新 」 的事情之一aegis 是 NoSQL 移動一群開發人員公開挑戰是所有的資料是/將/必須儲存在某種形式的關聯式資料庫系統中的概念。 資料表、 資料列、 欄、 主索引鍵、 外部索引鍵條件約束和透過 Null 值和是否為主索引鍵應該 … 是自然或 unnatural 一個引數是神聖執行任何動作?

在這份文件和其後續任務,我檢查不顧由那些在 NoSQL 移動主體工具之一:其名稱來自於 「 hu 的 MongoDBmongo 我們,」 根據到 MongoDB 網站 (和不,我不構成的)。 涵蓋大部分一切 MongoDB ish:安裝、 探索以及使用它從.NET Framework,包括 LINQ 支援提供 ; 從桌面應用程式及 Web 應用程式和服務 ; 其他環境,以及如何設定它,讓實際執行的 Windows 系統管理員 don’t 燒錄您 effigy 中使用。

問題 (或,為什麼執行我負責,一次?)

之前太深 MongoDB 的詳細資料,’s 公平問為什麼任何.NET Framework 開發人員應該犧牲下一個 half-hour 左右閱讀本文以及他們的膝上型電腦上遵循他們生活。 之後所有 SQL Server 進來提供比傳統企業或資料中心繫結關聯式資料庫的中較淺壓載資料儲存體選項是空閒及可轉散發的 Express 版和有肯定有充足的工具和程式庫可提供更容易存取它,包括 Microsoft 自己 ’s LINQ 和 Entity Framework。

問題在於關聯式模型強度 — 關聯式模型本身 — 也是其最大的缺點。 大多數開發人員是否.NET、 Java 或其他項目完全,可 — 之後只有幾年 ’ 經驗 — 痛苦的詳細說明如何一切 doesn’t 配合得很好資料表/列/欄 「 方形 」 模型。 嘗試模型階層式資料可以磁碟機甚至最有經驗的開發人員完全 bonkers,這麼多因此該 Joe Celko 撰寫一本書 — 「 Smarties 第三版的 SQL 」 (Morgan-Kaufmann,2005年) — 完全有關模型的關聯式模型中的階層式資料的概念。 而如果您新增到此基本 「 特定 」 亦關聯式資料庫假設非彈性的結構,以資料 — 資料庫結構描述 — 嘗試支援臨機操作 「 additionals 」 的資料會變成拙劣。 (快速,放映的指針:你那裡的多少處理資料庫已經備忘稿資料行,或甚至更,Note1、 Note2、 Note3 …?)

沒有人內 NoSQL 移動即將建議關聯式模型 doesn’t 有其優點或關聯式資料庫即將消失,但是在過去兩個數十年中的開發人員生命的基本事實是開發人員經常儲存資料 isn’t 原本就是 (或有時甚至從遠端) 關聯式在本質的關聯式資料庫中。

文件導向資料庫儲存 「 文件 」 (緊密 knit 通常不會連接到其他的資料元素在系統中的資料的集合) 而非 「 關聯 」。例如,部落格內容在部落格的系統是完全未連接另一個,甚至當其中一個不會參考另一個,最常連接是透過為了解除會參考由使用者 ’s 瀏覽器不在內部的超連結。 該部落格的註解完全限於該部落而很少嗎使用者曾經想要的所有註解而不管它們加註解的項目的彙總,請參閱。

此外,傾向於 Excel 在高效能或高並行處理環境中的文件導向資料庫 ; MongoDB 特別針對高效能而關閉的表親它 CouchDB 的目標是多在高並行處理的案例。 同時放棄任何一種 multi-object 交易支援,這表示,雖然它們支援單一物件的同時修改資料庫中,任何嘗試修改一個以上一次離開時間一個小視窗,這些修改可以看到 「 在傳遞 」)。文件在完整,已更新,但有 ’s 沒有跨越多重文件更新的交易的概念。 這 doesn’t 表示 MongoDB doesn’t 必須任何耐久性 — 它只是表示 MongoDB 執行個體 isn’t 前往電源故障,以及執行個體不會在 SQL Server 中存活下來。 系統需要完全不可部分完成性、 一致性、 隔離及耐久性 (ACID) 語意都更好關閉與傳統的關聯式資料庫系統如此重要的資料很可能 won’t 會看見 MongoDB 執行個體的內部任何時間快,除非也許當作住在 Web 伺服器上的複寫或快取資料。

在一般 MongoDB 將適用於應用程式和需要儲存資料,可以快速存取並且常使用的元件。 網站分析、 使用者喜好設定及設定 — 與系統資料 isn’t 完全結構化或必須是結構有彈性的任何排序 — MongoDB 的自然候選。 這 doesn’t 表示 MongoDB isn’t 完全準備好可以操作資料的主要資料存放區 ; 它只是表示 MongoDB 運作良好的可以由其中提供的區域數目以及傳統的 RDBMS doesn’t 的區域中。

使用者入門

如稍早提到 MongoDB 是從 MongoDB Web 站台 輕鬆地下載的開放原始碼軟體封裝mongodb.com. 開啟的 Web 瀏覽器中的網站應該足夠用來尋找 Windows 可下載二進位配套的連結 ; 看看 [下載] 連結之網頁的右手邊。 或如果您想要的話直接連結使用 mongodb.org/display/DOCS/downloads. 撰寫本文的穩定版本是 1.2.4 發行。 它 ’s 只.zip 檔案集結,因此安裝它是,相對說話、 ridiculously 簡單:只要將解壓縮任何地方需要內容。

嚴重。 就是這樣。

.zip 檔擴張到三個目錄:紙匣、 包含和 lib。 感興趣的唯一的目錄是包含八個可執行檔的紙。 沒有其他的二進位檔 (或執行階段) 相依性必要,而且在實際上只是兩個那些可執行檔感興趣的當時。 這些是 mongod.exe、 MongoDB 資料庫程序本身,且 mongo.exe 命令列殼層用戶端通常會使用相同的方式,與舊 isql.exe SQL Server 命令列殼層用戶端 — 以確定事情正確安裝及運作 ; 直接 ; 瀏覽資料及執行管理工作。

確認所有項目正確安裝就跟往 mongod 從命令列用戶端上引發一樣簡單。 根據預設值,MongoDB 想要將資料儲存在預設檔案系統路徑,c:\data\db,但這是可設定與透過--組態依名稱傳遞命令列上的文字檔案。 假設名為 db 子目錄存在 mongod 就會啟動的地方,驗證所有項目 kosher 非常簡單,只要您在 所看到的內容圖 1.


圖 1引發向上 Mongod.exe 確認成功的安裝

如果目錄 doesn’t 存在,MongoDB 將不會建立它。 請注意在我的 Windows 7 方塊上啟動 MongoDB 時一般 「 此應用程式想要開啟連接埠 」 對話方塊彈出。 請確定連接埠 (預設為 27017) 是可存取,或連接到它將會在 … 拙劣在最佳。 (比較上這後續文章,當我將討論將 MongoDB 放入生產環境中)。

一旦伺服器執行與命令介面連線到它就只是一般 — mongo.exe 應用程式會啟動一個命令列環境,可讓與該伺服器直接互動, 所示圖 2.


圖 2Mongo.exe 會啟動一個命令列環境,可讓與伺服器直接互動

預設情況下,殼層連接至 「 測試 」 的資料庫。 因為這裡的目標只是若要驗證所有項目使用所以測試是正常的。 當然從這裡它 ’s 很容易建立使用 MongoDB,例如描述某個人的快速物件某些範例資料。 ’s 成 MongoDB 如何檢視資料,以開機,如我們在 中快速多樣概略檢視圖 3.


圖 3建立範例資料

基本上,MongoDB 使用 JavaScript 物件表示法 (JSON) 作為說明其彈性並在其中用戶端會與它互動的方式與其資料標記法。 在內部,MongoDB 儲存 BSON 二進位 m 的 JSON,更容易儲存與編製索引的事情。 JSON 保持 MongoDB ’s 慣用的輸入/輸出格式不過,通常是文件中提供跨 MongoDB 網站和 Wiki 所用的格式。 如果您 ’re 不熟悉 JSON,它 ’s 筆刷,以在其上之前擷取嚴重到 MongoDB 是個不錯的作法。 只針對 grins,同時,對等到目錄中哪些 mongod 是儲存資料並查看的幾個 「 測試 」-具名往上有顯示檔案。

不足,無法播放 — 撰寫一些程式碼的時間。 結束殼層非常簡單,只要鍵入 「 結束 」 並關機伺服器需要只有一個 Ctrl + C 視窗中或關閉它; 伺服器擷取關閉訊號及關機的所有項目正確地結束處理程序前。

MongoDB ’s 伺服器 (和殼層雖然它 ’s 不最多的問題) 寫成原生的 C + + 應用程式 — 請記住這些? — 因此存取它需要某種知道如何透過命令和資料餵送至開啟的通訊端連線的.NET Framework 驅動程式。 MongoDB 散發 doesn’t 具有會與它,搭配的.NET Framework 驅動程式,但幸運的是,有提供的話,「 社群 」 在這種情況下是由 Sam Corder 名稱所開發人員已建立.NET Framework 驅動程式,以及 LINQ 支援存取 MongoDB 社群。 他的工作隨即出現在來源和從 的二進位形式github.com/samus/mongodb-csharp. 下載在該網頁 (在右上角外觀) 二進位碼檔案,或者是來源並建置它。 不論是哪一種方式結果是兩個組件:MongoDB.Driver.dll 並 MongoDB.Linq.dll。 快速加入參考,] 專案] 的 [參考] 節點和.NET Framework 已準備好要岩石。

撰寫程式碼

基本上,開啟執行 MongoDB 伺服器的連接是不多了不同於開啟其他資料庫的連接所顯示的 圖 4.

圖 4開啟到 MongoDB 伺服器連線

using System;
using MongoDB.Driver; 

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Mongo db = new Mongo();
      db.Connect(); //Connect to localhost on the default port
      db.Disconnect();
    }
  }
}

探索稍早建立的物件 isn’t 硬,剛 … … 與.NET Framework 開發人員使用之前 (請參閱 什麼不同圖 5).

圖 5探索建立的 Mongo 物件

using System;
using MongoDB.Driver; 

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Mongo db = new Mongo();
      db.Connect(); //Connect to localhost on the default port.
      Database test = db.getDB("test");
      IMongoCollection things = test.GetCollection("things");
      Document queryDoc = new Document();
      queryDoc.Append("lastname", "Neward");
      Document resultDoc = things.FindOne(queryDoc);
      Console.WriteLine(resultDoc);
      db.Disconnect();
    }
  }
}

如果這看起來有點可觀,放鬆 — 它因為 MongoDB 存放方式與傳統資料庫不同事物寫出 「 長方式 」。

首先請記住先前插入的資料必須在其上的三個欄位 — firstname、 姓氏和年齡,與上述任何這些的元件可擷取資料所用。 但更重要的是儲存它們而 cavalierly tossed 的那一行是 「 test.things.save () 」 — 這暗示著資料儲存在項目稱為 「 事物 」。在 MongoDB 術語 「 事物 」 是一個集合和隱含所有資料儲存在集合中。 集合輪流存放文件保留此值可以是其他的集合索引鍵/值組。 在這種情況下 「 事物 」 是儲存資料庫,這與先前所述是測試資料庫內的集合。

擷取資料的結果表示第一次連接到 MongoDB] 伺服器,然後測試的資料庫,然後尋找集合 「 事物 」。這是 何種第一次四行圖 5 執行 — 建立 Mongo 物件,代表連線、 連線到伺服器、 連線到測試資料庫及取得 「 事物 」 集合。

一旦傳回集合程式碼可以發出查詢,尋找透過 FindOne 呼叫一份文件。 但與所有資料庫用戶端 doesn’t 想要擷取集合中的每份文件並再尋找的一興趣 — 某種方式,查詢必須受到條件約束。 在 MongoDB,這是藉由建立包含欄位和要搜尋在這些欄位中一個稱為概念查詢藉由範例或 QBE 簡稱為資料的文件。 因為目標來尋找文件包含姓氏欄位,其值設為 「 Neward 」 所以文件包含一個姓氏欄位和它的值建立,並做為參數傳遞給 FindOne。 如果查詢,就成功則會傳回含有有問題的所有資料的另一個文件 (加上一個欄位),否則它會傳回 null。

藉由到最此描述的短的版本可以是簡要,做為:

Document anotherResult = 
         db["test"]["things"].FindOne(
           new Document().Append("lastname", "Neward"));
       Console.WriteLine(anotherResult);

當執行,不只嗎中傳送的原始值顯示,但新的一個同時也出現 _id 欄位包含 ObjectId 物件。 這是該物件的唯一的識別項,而且它以無訊息模式已插入資料庫來儲存新的資料時。 任何嘗試修改此物件必須保留該欄位或資料庫將假設 ’s 以傳送新的物件。 通常,是正確地修改由查詢傳回文件:

anotherResult["age"] = 39;
       things.Update(resultDoc);
       Console.WriteLine(
         db["test"]["things"].FindOne(
           new Document().Append("lastname", "Neward")));

不過,它 ’s 永遠可以建立新的文件執行個體,並且更有意義的話,它會以手動方式填寫 [_id] 欄位,以符合 [ObjectId:

Document ted = new Document();
       ted["_id"] = new MongoDB.Driver.Oid("4b61494aff75000000002e77");
       ted["firstname"] = "Ted";
       ted["lastname"] = "Neward";
       ted["age"] = 40;
       things.Update(ted);
       Console.WriteLine(
         db["test"]["things"].FindOne(
           new Document().Append("lastname", "Neward")));

當然如果 _id 已知,可用來當作查詢準則,也。

請注意文件是有效地不具型別 — 幾乎任何項目可以由儲存在欄位中包括一些核心.NET Framework 數值型別,例如日期時間的任何名稱。 技術上,如前所述,MongoDB 儲存包含一些延伸到傳統 JSON 類型的 BSON 資料 (字串,整數,布林值,雙和 null — 雖然 Null 值只允許在不在集合中的物件) 如上述 ObjectId、 二進位資料、 規則運算式和內嵌的 JavaScript 程式碼。 對於一下我們保留後者兩個單獨 — 事實 BSON 可以儲存二進位的資料表示可以降低到位元組陣列的任何可以被儲存,有效地表示 MongoDB 可以儲存任何項目,雖然它可能無法查詢到該的二進位 BLOB (二進位大型物件)。

不死 (或完成) 還!

有 ’s 更多關於 MongoDB、 包括 LINQ 支援 ; 執行更複雜超過所顯示到目前為止 ; 簡單 QBE 樣式查詢能力的伺服器端查詢和取得 MongoDB 幸好存留在實際執行伺服器伺服陣列中討論。 但現在,此份文件,並仔細檢查的 IntelliSense 應該足以讓啟動的工作程式設計人員。

藉由到最如果有 ’s 您想看到 explored 某個特定主題,don’t 直接卸除我附註。 很真實的方式它 ’s 您欄畢竟。 快樂撰寫程式碼 !

Ted Neward 是與 Neward & 夥伴,一個獨立公司珍貴企業.NET Framework 和 Java 平台的系統中的主體。 他已經寫入超過 100 個發行項、 是一個 C# MVP,INETA 演講者和已編寫和 coauthored 十幾書籍包括在眼前 「 專業 F # 2.0 」 (Wrox)。他諮詢和定期 mentors — 到達他在 ted@tedneward.com 或讀取在他部落格 blogs.tedneward.com.

多虧來檢閱本文的下列的技術專家:Kyle Banker 和 Sam Corder