欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在.Net中使用MongoDB的方法教程

 更新時(shí)間:2017年05月22日 14:15:26   作者:趙大寶  
最近在研究mongodb,在網(wǎng)上搜索發(fā)現(xiàn)針對(duì).net 中使用mongodb的文章要么是早期的驅(qū)動(dòng)版本,要么資料很少,所以寫個(gè)隨筆記錄一下,本文詳細(xì)的給大家介紹了在.Net中使用MongoDB的方法教程,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。

什么是MongoDB

MongoDB是基于文檔的存儲(chǔ)的(而非表),是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點(diǎn)是他支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。Mongo主要解決的是海量數(shù)據(jù)的訪問(wèn)效率問(wèn)題。因?yàn)镸ongo主要是支持海量數(shù)據(jù)存儲(chǔ)的,所以Mongo還自帶了一個(gè)出色的分布式文件系統(tǒng)GridFS,可以支持海量的數(shù)據(jù)存儲(chǔ)。由于Mongo可以支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),而且?guī)в袕?qiáng)大的數(shù)據(jù)查詢功能,因此非常受到歡迎。

BSON是MongoDB的數(shù)據(jù)存儲(chǔ)格式。大家對(duì)于JSON比較熟悉,但是什么是BSON呢BSON基于JSON格式,選擇JSON進(jìn)行改造的原因主要是JSON的通用性及JSON的schemaless的特性。

BSON具有如下特點(diǎn)

1.更快的遍歷速度

  對(duì)JSON格式來(lái)說(shuō),太大的JSON結(jié)構(gòu)會(huì)導(dǎo)致數(shù)據(jù)遍歷非常慢。在JSON中,要跳過(guò)一個(gè)文檔進(jìn)行數(shù)據(jù)讀取,需要對(duì)此文檔進(jìn)行掃描才行,需要進(jìn)行麻煩數(shù)據(jù)結(jié)構(gòu)匹配,比如括號(hào)的匹配,而BSON對(duì)JSON的一大改進(jìn)就是,它會(huì)將JSON的每一個(gè)元素的長(zhǎng)度存在元素的頭部,這樣你只需要讀取到元素長(zhǎng)度就能直接seek到指定的點(diǎn)上進(jìn)行讀取了。

2.操作更簡(jiǎn)易

  對(duì)JSON來(lái)說(shuō),數(shù)據(jù)存儲(chǔ)是無(wú)類型的,比如你要修改基本一個(gè)值,從9到10,由于從一個(gè)字符變成了兩個(gè),所以可能其后面的所有內(nèi)容都需要往后移一位才可以。而使用BSON,你可以指定這個(gè)列為數(shù)字列,那么無(wú)論數(shù)字從9長(zhǎng)到10還是100,我們都只是在存儲(chǔ)數(shù)字的那一位上進(jìn)行修改,不會(huì)導(dǎo)致數(shù)據(jù)總長(zhǎng)變大。當(dāng)然,在MongoDB中,如果數(shù)字從整形增大到長(zhǎng)整型,還是會(huì)導(dǎo)致數(shù)據(jù)總長(zhǎng)變大的。

3.增加了額外的數(shù)據(jù)類型

  JSON是一個(gè)很方便的數(shù)據(jù)交換格式,但是其類型比較有限。BSON在其基礎(chǔ)上增加了“byte array”數(shù)據(jù)類型。這使得二進(jìn)制的存儲(chǔ)不再需要先base64轉(zhuǎn)換后再存成JSON。大大減少了計(jì)算開銷和數(shù)據(jù)大小。當(dāng)然,在有的時(shí)候,BSON相對(duì)JSON來(lái)說(shuō)也并沒(méi)有空間上的優(yōu)勢(shì),因?yàn)橛辛祟愋透拍睢?/p>

MongoDB windows下 安裝

MongoDB的安裝很簡(jiǎn)單,設(shè)置好安裝路徑后,一直Next直到安裝結(jié)束,最大的坑就是MongoDB服務(wù)的安裝,下面具體說(shuō)下MongoDB安裝之后的一些配置操作

1.在根目錄下創(chuàng)建數(shù)據(jù)庫(kù)路徑(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 #錯(cuò)誤日志采用追加模式,配置這個(gè)選項(xiàng)后mongodb的日志會(huì)追加到現(xiàn)有的日志文件,而不是從新創(chuàng)建一個(gè)新文件

journal=true #啟用日志文件,默認(rèn)啟用

quiet=true #這個(gè)選項(xiàng)可以過(guò)濾掉一些無(wú)用的日志信息,若需要調(diào)試使用請(qǐng)?jiān)O(shè)置為false

port=27017 #端口號(hào) 默認(rèn)為27017

auth=true #啟用驗(yàn)證 需要用戶名密碼 

配置完成以上2個(gè)步驟 就可以 啟動(dòng)MongoDB了

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

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

3.創(chuàng)建并啟動(dòng)MongoDB服務(wù)

如果每次都按照步驟三那樣操作,豈不是相當(dāng)麻煩,按照如下命令來(lái)創(chuàng)建并啟動(dòng)MongoDB服務(wù),就可以通過(guò)windows服務(wù)來(lái)管理MongoDB的啟動(dòng)和關(guān)閉了

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

net start MongoDB 

測(cè)試是否成功 可以在 瀏覽器中輸入http://localhost:27017/如果出現(xiàn)下圖表示服務(wù)安裝成功

如果需要卸載MongoDB服務(wù) 在CMD 中運(yùn)行

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

前期準(zhǔn)備工作完成了,就可以開始擼代碼了

如何在.net 中使用MongoDB

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

部分代碼如下

private static MongoClient client;

private static IMongoDatabase database;

//本地配置

private const string MongoDBConnectionStr = "mongodb://localhost";

//數(shù)據(jù)庫(kù)名稱

private static string DefaultDataBaseName = "Test";

 

 

public MongoDBHelper()

{

 GetConnection(DefaultDataBaseName);

}

 

/// <summary>

/// 構(gòu)造函數(shù) 指定數(shù)據(jù)庫(kù)

/// </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ù),手動(dòng)輸入collection name

/// </summary>

public Task InsertAsync<T>(string collectionName, T obj)

{

 if (database == null)

 {

  throw new Exception("沒(méi)有指定數(shù)據(jù)庫(kù)");

 }

 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ù),手動(dòng)輸入collection name

/// </summary>

public Task BatchInsertAsync<T>(string collectionName, IEnumerable<T> objs)

{

 if (database == null)

 {

  throw new Exception("沒(méi)有指定數(shù)據(jù)庫(kù)");

 }

 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。手動(dòng)輸入collection name

/// </summary>

public IFindFluent<T, T> Find<T>(string collectionName, FilterDefinition<T> filter, FindOptions options = null)

{

 if (database == null)

 {

  throw new Exception("沒(méi)有指定數(shù)據(jù)庫(kù)");

 }

 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中多個(gè)排序條件逗號(hào)分隔,默認(rèn)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中多個(gè)排序條件逗號(hào)分隔,默認(rèn)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);

} 

示例代碼中只實(shí)現(xiàn)了插入和查詢功能,后續(xù)會(huì)將完整代碼上傳

總結(jié)

本文只記錄了MongoDB的最基本使用,后續(xù)會(huì)介紹副本級(jí),主從自動(dòng)備份等機(jī)制與實(shí)現(xiàn)方式,感興趣的朋友們請(qǐng)繼續(xù)關(guān)注腳本之家,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • ASP.NET中MVC傳遞數(shù)據(jù)的幾種形式總結(jié)

    ASP.NET中MVC傳遞數(shù)據(jù)的幾種形式總結(jié)

    這篇文章主要介紹了ASP.NET中MVC傳遞數(shù)據(jù)的幾種形式,以實(shí)例形式較為詳細(xì)的分析總結(jié)了MVC數(shù)據(jù)傳遞的相關(guān)技巧與注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • .NET與樹莓派控制彩色燈帶WS28XX的實(shí)現(xiàn)

    .NET與樹莓派控制彩色燈帶WS28XX的實(shí)現(xiàn)

    這篇文章主要為大家介紹了.NET與樹莓派控制彩色燈帶WS28XX的實(shí)現(xiàn)過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • ASP.NET Core文件上傳與下載實(shí)例(多種上傳方式)

    ASP.NET Core文件上傳與下載實(shí)例(多種上傳方式)

    下面小編就為大家分享一篇ASP.NET Core文件上傳與下載實(shí)例(多種上傳方式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • .net framework中引進(jìn)的var對(duì)象類型聲明

    .net framework中引進(jìn)的var對(duì)象類型聲明

    安裝了vs 2008之后,在后臺(tái)代碼中,resharper插件對(duì)后臺(tái)所有局部變量進(jìn)行提示建議,顯示需要采用use implicitly typed local variable declaration,通過(guò)代碼修改建議
    2010-12-12
  • asp.net動(dòng)態(tài)產(chǎn)生checkbox(數(shù)據(jù)源為DB或內(nèi)存集合)

    asp.net動(dòng)態(tài)產(chǎn)生checkbox(數(shù)據(jù)源為DB或內(nèi)存集合)

    動(dòng)態(tài)產(chǎn)生一組checkbox(數(shù)據(jù)源為DB或內(nèi)存集合)且post提交時(shí)后臺(tái)能及時(shí)獲取等等,打算使用repeater+input(checkbox)+input(hidden)來(lái)實(shí)現(xiàn)
    2013-10-10
  • .Net Core 中選項(xiàng)Options的具體實(shí)現(xiàn)

    .Net Core 中選項(xiàng)Options的具體實(shí)現(xiàn)

    這篇文章主要介紹了.Net Core 中選項(xiàng)Options的具體實(shí)現(xiàn),文中運(yùn)用大量代碼對(duì)相關(guān)知識(shí)詳細(xì)介紹,感興趣的小伙伴可以參考一下這篇文章,希望對(duì)你有所幫助
    2021-09-09
  • ASP.NET中repeater控件用法實(shí)例

    ASP.NET中repeater控件用法實(shí)例

    這篇文章主要介紹了ASP.NET中repeater控件用法,實(shí)例分析了repeater控件數(shù)據(jù)綁定、刪除等相關(guān)技巧,具有一定實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)(圖文詳解)

    asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)(圖文詳解)

    此例子綁定的數(shù)據(jù)源為微軟在mssql2000中提供的Northwind數(shù)據(jù)庫(kù)中的表Categories。
    2013-07-07
  • .NET微信公眾號(hào) 用戶分組管理

    .NET微信公眾號(hào) 用戶分組管理

    這篇文章主要介紹了.NET微信公眾號(hào) 用戶分組管理,web頁(yè)面設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • .NET?6中的dotnet?monitor講解

    .NET?6中的dotnet?monitor講解

    dotnet?monitor為Azure?App?Service(Linux)提供.NET?應(yīng)用程序的診斷工具提供支持。這篇文章講解了.NET?6中的dotnet?monitor,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12

最新評(píng)論