分享在.Net中使用MongoDB的執行個體詳解

來源:互聯網
上載者:User
最近在研究mongodb,在網上搜尋發現針對.net 中使用mongodb的文章要麼是早期的驅動版本,要麼資料很少,所以寫個隨筆記錄一下,本文詳細的給大家介紹了在.Net中使用MongoDB的方法教程,需要的朋友可以參考借鑒,下面來一起看看吧。

什麼是MongoDB

MongoDB是基於文檔的儲存的(而非表),是一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。他支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料類型。Mongo最大的特點是他支援的查詢語言非常強大,其文法有點類似於物件導向的查詢語言,幾乎可以實作類別似關聯式資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。Mongo主要解決的是海量資料的訪問效率問題。因為Mongo主要是支援海量資料存放區的,所以Mongo還內建了一個出色的Distributed File SystemGridFS,可以支援海量的資料存放區。由於Mongo可以支援複雜的資料結構,而且帶有強大的資料查詢功能,因此非常受到歡迎。

BSON是MongoDB的資料存放區格式。大家對於JSON比較熟悉,但是什麼是BSON呢BSON基於JSON格式,選擇JSON進行改造的原因主要是JSON的通用性及JSON的schemaless的特性。

BSON具有如下特點

1.更快的遍曆速度

  對JSON格式來說,太大的JSON結構會導致資料遍曆非常慢。在JSON中,要跳過一個文檔進行資料讀取,需要對此文檔進行掃描才行,需要進行麻煩資料結構匹配,比如括弧的匹配,而BSON對JSON的一大改進就是,它會將JSON的每一個元素的長度存在元素的頭部,這樣你只需要讀取到元素長度就能直接seek到指定的點上進行讀取了。

2.操作更簡易

  對JSON來說,資料存放區是無類型的,比如你要修改基本一個值,從9到10,由於從一個字元變成了兩個,所以可能其後面的所有內容都需要往後移一位才可以。而使用BSON,你可以指定這個列為數字列,那麼無論數字從9長到10還是100,我們都只是在儲存數位那一位上進行修改,不會導致資料總長變大。當然,在MongoDB中,如果數字從整形增大到長整型,還是會導致資料總長變大的。

3.增加了額外的資料類型

  JSON是一個很方便的資料交換格式,但是其類型比較有限。BSON在其基礎上增加了“byte array”資料類型。這使得二進位的儲存不再需要先base64轉換後再存成JSON。大大減少了計算開銷和資料大小。當然,在有的時候,BSON相對JSON來說也並沒有空間上的優勢,因為有了類型概念。

MongoDB windows下 安裝

MongoDB的安裝很簡單,設定好安裝路徑後,一直Next直到安裝結束,最大的坑就是MongoDB服務的安裝,下面具體說下MongoDB安裝之後的一些配置操作

1.在根目錄下建立資料庫路徑(data目錄)、日誌路徑(logs目錄)、記錄檔(mongo.log檔案)、配置路徑(conf目錄)我的安裝路徑是:D:\Program Files\mongodb

2.在conf目錄下建立設定檔mongo.conf,檔案內容如下:

logpath=D:\Program Files\mongodb\logs\mongodb.log #日誌輸出檔案路徑logappend=true #錯誤記錄檔採用追加模式,配置這個選項後mongodb的日誌會追加到現有的記錄檔,而不是從新建立一個新檔案journal=true #啟用記錄檔,預設啟用quiet=true #這個選項可以過濾掉一些無用的日誌資訊,若需要調試使用請設定為falseport=27017 #連接埠號碼 預設為27017auth=true #啟用驗證 需要使用者名稱密碼

配置完成以上2個步驟 就可以 啟動MongoDB了

運行CMD 輸入命令 (注意 mongod的路徑)

mongod --config " D:\Program Files\mongodb\data \conf\mongo.conf"

3.建立並啟動MongoDB服務

如果每次都按照步驟三那樣操作,豈不是相當麻煩,按照如下命令來建立並啟動MongoDB服務,就可以通過windows服務來管理MongoDB的啟動和關閉了


mongod --config " D:\Program Files\mongodb\data \conf\mongo.conf" --install --serviceName "MongoDB"net start MongoDB

測試是否成功 可以在 瀏覽器中輸入http://localhost:27017/如果出現表示服務安裝成功

如果需要卸載MongoDB服務 在CMD 中運行


mongod.exe --remove --serviceName "MongoDB"

前期準備工作完成了,就可以開始擼代碼了

如何在.net 中使用MongoDB

首先在項目中引入 MongoDB.Bson.dll,MongoDB.Driver.dll,MongoDB.Driver.Core.dll 我使用的是2.0版本的 現在好多文章都是介紹使用1+版本的 這也是我寫此文的目的引入驅動DLL後,就可以開始擼代碼了

部分代碼如下

private static MongoClient client;private static IMongoDatabase database;//本地配置private const string MongoDBConnectionStr = "mongodb://localhost";//資料庫名稱private static string DefaultDataBaseName = "Test";  public MongoDBHelper(){ GetConnection(DefaultDataBaseName);} /// <summary>/// 建構函式 指定資料庫/// </summary>/// <param name="dataBaseName"></param>public MongoDBHelper(string dataBaseName){ GetConnection(dataBaseName);} private static void GetConnection(string dataBaseName){ client = new MongoClient(MongoDBConnectionStr); database = client.GetDatabase(dataBaseName);}/// <summary>/// 非同步插入一條資料,手動輸入collection name/// </summary>public Task InsertAsync<T>(string collectionName, T obj){ if (database == null) {  throw new Exception("沒有指定資料庫"); } var collection = database.GetCollection<T>(collectionName); return collection.InsertOneAsync(obj);} /// <summary>/// 非同步插入一條資料,採用類型T的完全限定名作為collection name/// </summary>public Task InsertAsync<T>(T obj){ return InsertAsync(typeof(T).FullName, obj);} /// <summary>/// 非同步插入多條資料,手動輸入collection name/// </summary>public Task BatchInsertAsync<T>(string collectionName, IEnumerable<T> objs){ if (database == null) {  throw new Exception("沒有指定資料庫"); } if (objs == null) {  throw new ArgumentException(); } var collection = database.GetCollection<T>(collectionName); return collection.InsertManyAsync(objs);} /// <summary>/// 非同步插入多條資料,採用類型T的完全限定名作為collection name/// </summary>public Task BatchInsertAsync<T>(IEnumerable<T> objs){ return BatchInsertAsync(typeof(T).FullName, objs);} /// <summary>/// 插入一條資料/// </summary>public void Insert<T>(T obj){ InsertAsync(obj).Wait();} /// <summary>/// 插入多條資料/// </summary>public void Insert<T>(IEnumerable<T> objs){ BatchInsertAsync(objs).Wait();}/// <summary>/// MongoDB C# Driver的Find方法,返回IFindFluent。手動輸入collection name/// </summary>public IFindFluent<T, T> Find<T>(string collectionName, FilterDefinition<T> filter, FindOptions options = null){ if (database == null) {  throw new Exception("沒有指定資料庫"); } var collection = database.GetCollection<T>(collectionName); return collection.Find(filter, options);}/// <summary>/// MongoDB C# Driver的Find方法,返回IFindFluent。採用類型T的完全限定名作為collection name/// </summary>public IFindFluent<T, T> Find<T>(FilterDefinition<T> filter, FindOptions options = null){ return Find(typeof(T).FullName, filter, options);}/// <summary>/// 取合格資料 sort中多個排序條件逗號分隔,預設asc/// </summary>public List<T> Get<T>(Expression<Func<T, bool>> condition, int skip, int limit, string sort){ return Get(new List<Expression<Func<T, bool>>> { condition }, skip, limit, sort);}public List<T> Get<T>(Expression<Func<T, bool>> condition){ return Get(condition, 0, 0, null);}/// <summary>/// 取合格資料 sort中多個排序條件逗號分隔,預設asc/// </summary>public List<T> Get<T>(List<Expression<Func<T, bool>>> conditions, int skip, int limit, string sort){ if (conditions == null || conditions.Count == 0) {  conditions = new List<Expression<Func<T, bool>>> { x => true }; } var builder = Builders<T>.Filter; var filter = builder.And(conditions.Select(x => builder.Where(x))); var ret = new List<T>(); try {  List<SortDefinition<T>> sortDefList = new List<SortDefinition<T>>();  if (sort != null)  {   var sortList = sort.Split(',');   for (var i = 0; i < sortList.Length; i++)   {    var sl = Regex.Replace(sortList[i].Trim(), @"\s+", " ").Split(' ');    if (sl.Length == 1 || (sl.Length >= 2 && sl[1].ToLower() == "asc"))    {     sortDefList.Add(Builders<T>.Sort.Ascending(sl[0]));    }    else if (sl.Length >= 2 && sl[1].ToLower() == "desc")    {     sortDefList.Add(Builders<T>.Sort.Descending(sl[0]));    }   }  }  var sortDef = Builders<T>.Sort.Combine(sortDefList);  ret = Find(filter).Sort(sortDef).Skip(skip).Limit(limit).ToListAsync().Result; } catch (Exception e) {  //異常處理 } return ret;}public List<T> Get<T>(List<Expression<Func<T, bool>>> conditions){ return Get(conditions, 0, 0, null);}

範例程式碼中只實現了插入和查詢功能,後續會將完整代碼上傳

總結

本文只記錄了MongoDB的最基本使用,後續會介紹副本級,主從自動備份等機制與實現方式。

【相關推薦】

1. ASP.NET免費視頻教程

2. Python使用MONGODB入門執行個體

3. Python操作MongoDB資料庫PyMongo庫使用方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.