首頁 >後端開發 >C#.Net教程 >.Net中如何使用MongoDB的方法教程

.Net中如何使用MongoDB的方法教程

黄舟
黄舟原創
2017-05-28 10:18:372037瀏覽

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

什麼是MongoDB

MongoDB是基於文件的儲存的(而非表),是介於關聯式資料庫和非關聯式資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關聯式資料庫的。他支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料類型。 Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似物件導向的查詢語言,幾乎可以實現類似關聯式資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。 Mongo主要解決的是大量資料的存取效率問題。因為Mongo主要是支援海量資料儲存的,所以Mongo也自帶了一個出色的分散式檔案系統GridFS,可以支援海量的資料儲存。由於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 #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false

port=27017 #端口号 默认为27017

auth=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(&#39;,&#39;);

   for (var i = 0; i < sortList.Length; i++)

   {

    var sl = Regex.Replace(sortList[i].Trim(), @"\s+", " ").Split(&#39; &#39;);

    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的最基本使用,后续会介绍副本级,主从自动备份等机制与实现方式,感兴趣的朋友们请继续关注脚本之家,谢谢大家对脚本之家的支持。

以上是.Net中如何使用MongoDB的方法教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn