在.Net中使用MongoDB的方法教程
什么是MongoDB
MongoDB是基于文檔的存儲的(而非表),是一個介于關系數(shù)據(jù)庫和非關系數(shù)據(jù)庫之間的產(chǎn)品,是非關系數(shù)據(jù)庫當中功能最豐富,最像關系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結構非常松散,是類似json的bson格式,因此可以存儲比較復雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向對象的查詢語言,幾乎可以實現(xiàn)類似關系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。Mongo主要解決的是海量數(shù)據(jù)的訪問效率問題。因為Mongo主要是支持海量數(shù)據(jù)存儲的,所以Mongo還自帶了一個出色的分布式文件系統(tǒng)GridFS,可以支持海量的數(shù)據(jù)存儲。由于Mongo可以支持復雜的數(shù)據(jù)結構,而且?guī)в袕姶蟮臄?shù)據(jù)查詢功能,因此非常受到歡迎。
BSON是MongoDB的數(shù)據(jù)存儲格式。大家對于JSON比較熟悉,但是什么是BSON呢BSON基于JSON格式,選擇JSON進行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
BSON具有如下特點
1.更快的遍歷速度
對JSON格式來說,太大的JSON結構會導致數(shù)據(jù)遍歷非常慢。在JSON中,要跳過一個文檔進行數(shù)據(jù)讀取,需要對此文檔進行掃描才行,需要進行麻煩數(shù)據(jù)結構匹配,比如括號的匹配,而BSON對JSON的一大改進就是,它會將JSON的每一個元素的長度存在元素的頭部,這樣你只需要讀取到元素長度就能直接seek到指定的點上進行讀取了。
2.操作更簡易
對JSON來說,數(shù)據(jù)存儲是無類型的,比如你要修改基本一個值,從9到10,由于從一個字符變成了兩個,所以可能其后面的所有內(nèi)容都需要往后移一位才可以。而使用BSON,你可以指定這個列為數(shù)字列,那么無論數(shù)字從9長到10還是100,我們都只是在存儲數(shù)字的那一位上進行修改,不會導致數(shù)據(jù)總長變大。當然,在MongoDB中,如果數(shù)字從整形增大到長整型,還是會導致數(shù)據(jù)總長變大的。
3.增加了額外的數(shù)據(jù)類型
JSON是一個很方便的數(shù)據(jù)交換格式,但是其類型比較有限。BSON在其基礎上增加了“byte array”數(shù)據(jù)類型。這使得二進制的存儲不再需要先base64轉換后再存成JSON。大大減少了計算開銷和數(shù)據(jù)大小。當然,在有的時候,BSON相對JSON來說也并沒有空間上的優(yōu)勢,因為有了類型概念。
MongoDB windows下 安裝
MongoDB的安裝很簡單,設置好安裝路徑后,一直Next直到安裝結束,最大的坑就是MongoDB服務的安裝,下面具體說下MongoDB安裝之后的一些配置操作
1.在根目錄下創(chuàng)建數(shù)據(jù)庫路徑(data目錄)、日志路徑(logs目錄)、日志文件(mongo.log文件)、配置路徑(conf目錄)我的安裝路徑是:D:\Program Files\mongodb
2.在conf目錄下創(chuàng)建配置文件mongo.conf,文件內(nèi)容如下:
logpath=D:\Program Files\mongodb\logs\mongodb.log #日志輸出文件路徑 logappend=true #錯誤日志采用追加模式,配置這個選項后mongodb的日志會追加到現(xiàn)有的日志文件,而不是從新創(chuàng)建一個新文件 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.創(chuàng)建并啟動MongoDB服務
如果每次都按照步驟三那樣操作,豈不是相當麻煩,按照如下命令來創(chuàng)建并啟動MongoDB服務,就可以通過windows服務來管理MongoDB的啟動和關閉了
mongod --config " D:\Program Files\mongodb\data \conf\mongo.conf" --install --serviceName "MongoDB" net start MongoDB
測試是否成功 可以在 瀏覽器中輸入http://localhost:27017/如果出現(xiàn)下圖表示服務安裝成功

如果需要卸載MongoDB服務 在CMD 中運行
mongod.exe --remove --serviceName "MongoDB"
前期準備工作完成了,就可以開始擼代碼了
如何在.net 中使用MongoDB
首先在項目中引入 MongoDB.Bson.dll,MongoDB.Driver.dll,MongoDB.Driver.Core.dll 我使用的是2.0版本的 現(xiàn)在好多文章都是介紹使用1+版本的 這也是我寫此文的目的引入驅動DLL后,就可以開始擼代碼了
部分代碼如下
private static MongoClient client;
private static IMongoDatabase database;
//本地配置
private const string MongoDBConnectionStr = "mongodb://localhost";
//數(shù)據(jù)庫名稱
private static string DefaultDataBaseName = "Test";
public MongoDBHelper()
{
GetConnection(DefaultDataBaseName);
}
/// <summary>
/// 構造函數(shù) 指定數(shù)據(jù)庫
/// </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>
/// 異步插入一條數(shù)據(jù),手動輸入collection name
/// </summary>
public Task InsertAsync<T>(string collectionName, T obj)
{
if (database == null)
{
throw new Exception("沒有指定數(shù)據(jù)庫");
}
var collection = database.GetCollection<T>(collectionName);
return collection.InsertOneAsync(obj);
}
/// <summary>
/// 異步插入一條數(shù)據(jù),采用類型T的完全限定名作為collection name
/// </summary>
public Task InsertAsync<T>(T obj)
{
return InsertAsync(typeof(T).FullName, obj);
}
/// <summary>
/// 異步插入多條數(shù)據(jù),手動輸入collection name
/// </summary>
public Task BatchInsertAsync<T>(string collectionName, IEnumerable<T> objs)
{
if (database == null)
{
throw new Exception("沒有指定數(shù)據(jù)庫");
}
if (objs == null)
{
throw new ArgumentException();
}
var collection = database.GetCollection<T>(collectionName);
return collection.InsertManyAsync(objs);
}
/// <summary>
/// 異步插入多條數(shù)據(jù),采用類型T的完全限定名作為collection name
/// </summary>
public Task BatchInsertAsync<T>(IEnumerable<T> objs)
{
return BatchInsertAsync(typeof(T).FullName, objs);
}
/// <summary>
/// 插入一條數(shù)據(jù)
/// </summary>
public void Insert<T>(T obj)
{
InsertAsync(obj).Wait();
}
/// <summary>
/// 插入多條數(shù)據(jù)
/// </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("沒有指定數(shù)據(jù)庫");
}
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>
/// 取符合條件的數(shù)據(jù) 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>
/// 取符合條件的數(shù)據(jù) 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);
}
示例代碼中只實現(xiàn)了插入和查詢功能,后續(xù)會將完整代碼上傳
總結
本文只記錄了MongoDB的最基本使用,后續(xù)會介紹副本級,主從自動備份等機制與實現(xiàn)方式,感興趣的朋友們請繼續(xù)關注腳本之家,謝謝大家對腳本之家的支持。
相關文章
ASP.NET中MVC傳遞數(shù)據(jù)的幾種形式總結
這篇文章主要介紹了ASP.NET中MVC傳遞數(shù)據(jù)的幾種形式,以實例形式較為詳細的分析總結了MVC數(shù)據(jù)傳遞的相關技巧與注意事項,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10
asp.net動態(tài)產(chǎn)生checkbox(數(shù)據(jù)源為DB或內(nèi)存集合)
動態(tài)產(chǎn)生一組checkbox(數(shù)據(jù)源為DB或內(nèi)存集合)且post提交時后臺能及時獲取等等,打算使用repeater+input(checkbox)+input(hidden)來實現(xiàn)2013-10-10
.Net Core 中選項Options的具體實現(xiàn)
這篇文章主要介紹了.Net Core 中選項Options的具體實現(xiàn),文中運用大量代碼對相關知識詳細介紹,感興趣的小伙伴可以參考一下這篇文章,希望對你有所幫助2021-09-09
asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)(圖文詳解)
此例子綁定的數(shù)據(jù)源為微軟在mssql2000中提供的Northwind數(shù)據(jù)庫中的表Categories。2013-07-07

