在花了不少時(shí)間研究學(xué)習(xí)了MongoDB數(shù)據(jù)庫的相關(guān)知識(shí)站叼,以及利用C#對(duì)MongoDB數(shù)據(jù)庫的封裝原茅、測(cè)試應(yīng)用后澈蟆,決定花一些時(shí)間來總結(jié)一下最近的研究心得响牛,把這個(gè)數(shù)據(jù)庫的應(yīng)用單獨(dú)作為一個(gè)系列來介紹妓湘,希望從各個(gè)方面來總結(jié)并記錄一下這個(gè)新型查蓉、看似神秘的數(shù)據(jù)庫使用過程。本文是這個(gè)系列的開篇榜贴,主要介紹一些MongoDB數(shù)據(jù)庫的基礎(chǔ)知識(shí)豌研、安裝過程、基礎(chǔ)使用等方面唬党。
MongoDB是一款由C++編寫的高性能鹃共、開源、無模式的常用非關(guān)系型數(shù)據(jù)庫產(chǎn)品驶拱,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富霜浴、最像關(guān)系數(shù)據(jù)庫的數(shù)據(jù)庫。它擴(kuò)展了關(guān)系型數(shù)據(jù)庫的眾多功能蓝纲,例如:輔助索引阴孟、范圍查詢晌纫、排序等。
MongoDB主要解決的是海量數(shù)據(jù)的訪問效率問題永丝,它作為分布式數(shù)據(jù)崛起后锹漱,使用較多的一款非結(jié)構(gòu)數(shù)據(jù)庫,必然有其值得稱道之處慕嚷,它的主要功能特性如下:
1)面向集合的存儲(chǔ)哥牍,適合存儲(chǔ)對(duì)象及JSON形式的數(shù)據(jù)。
2)動(dòng)態(tài)查詢喝检,MongoDB支持豐富的查詢表達(dá)式嗅辣。查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組挠说。
3)完整的索引支持澡谭,包括文檔內(nèi)嵌對(duì)象及數(shù)組。MongoDB的查詢優(yōu)化器會(huì)分析查詢表達(dá)式纺涤,并生成一個(gè)高效的查詢計(jì)劃译暂。
4)查詢監(jiān)視,MongoDB包含一個(gè)監(jiān)視工具用于分析數(shù)據(jù)庫操作的性能撩炊。
5)復(fù)制及自動(dòng)故障轉(zhuǎn)移,MongoDB數(shù)據(jù)庫支持服務(wù)器之間的數(shù)據(jù)復(fù)制崎脉,支持主-從模式及服務(wù)器之間的相互復(fù)制拧咳。復(fù)制的主要目標(biāo)是提供冗余及自動(dòng)故障轉(zhuǎn)移。
6)高效的傳統(tǒng)存儲(chǔ)方式囚灼,支持二進(jìn)制數(shù)據(jù)及大型對(duì)象(如圖片或視頻)骆膝。
7)自動(dòng)分片以支持云級(jí)別的伸縮性,自動(dòng)分片功能支持水平的數(shù)據(jù)庫集群灶体,可動(dòng)態(tài)添加額外的機(jī)器阅签。
1、MongoDB數(shù)據(jù)庫和傳統(tǒng)關(guān)系數(shù)據(jù)庫的對(duì)比
MongoDB數(shù)據(jù)庫有幾個(gè)簡單的概念需要了解一下蝎抽。
1)MongoDB中的 database
有著和我們熟知的"數(shù)據(jù)庫"一樣的概念 (對(duì) Oracle 來說就是 schema)政钟。一個(gè) MongoDB 實(shí)例中,可以有零個(gè)或多個(gè)數(shù)據(jù)庫樟结,每個(gè)都作為一個(gè)高等容器养交,用于存儲(chǔ)數(shù)據(jù)。
2)數(shù)據(jù)庫中可以有零個(gè)或多個(gè) collections
(集合)瓢宦。集合和傳統(tǒng)意義上的 table 基本一致碎连,可以簡單的把兩者看成是一樣的東西。
3)集合是由零個(gè)或多個(gè) documents
(文檔)組成驮履。同樣鱼辙,一個(gè)文檔可以看成是一 row
廉嚼。
4)文檔是由零個(gè)或多個(gè) fields
(字段)組成。,對(duì)應(yīng)的就是關(guān)系數(shù)據(jù)庫的 columns
倒戏。
5)Indexes
(索引)在 MongoDB 中扮演著和它們?cè)?RDBMS 中一樣的角色前鹅,都是為了提高查詢的效率。
6)Cursors
(游標(biāo))和上面的五個(gè)概念都不一樣峭梳,但是它非常重要舰绘,并且經(jīng)常被忽視,其中最重要的你要理解的一點(diǎn)是葱椭,游標(biāo)是當(dāng)你問 MongoDB 拿數(shù)據(jù)的時(shí)候捂寿,它會(huì)給你返回一個(gè)結(jié)果集的指針而不是真正的數(shù)據(jù),這個(gè)指針我們叫它游標(biāo)孵运,我們可以拿游標(biāo)做我們想做的任何事情秦陋,比如說計(jì)數(shù)或者跨行之類的,而無需把真正的數(shù)據(jù)拖下來治笨,在真正的數(shù)據(jù)上操作驳概。
它們的對(duì)比關(guān)系圖如下所示。
數(shù)據(jù)在Mongodb里面都是以Json格式方式進(jìn)行存儲(chǔ)的旷赖,如下所示是其中的一個(gè)記錄內(nèi)容顺又。
{
_id: ObjectID('4bd9e8e17cefd644108961bb'),
name:'Vivek',
class : '12th',
subjects: [ 'physics', 'chemistry', 'math', 'english', 'computer'],
address: {
house_no: '12B',
block: 'B',
sector: 12,
city : 'noida',
},
grade: [
{
exam: 'unit test 1',
score: '60%'
},
{
exam: 'unit test 2',
score: '70%'
}
]
}
在過去的很長一段時(shí)間中,關(guān)系型數(shù)據(jù)庫一直是最主流的數(shù)據(jù)庫解決方案等孵,他運(yùn)用真實(shí)世界中事物與關(guān)系來解釋數(shù)據(jù)庫中抽象的數(shù)據(jù)架構(gòu)稚照。然而,在信息技術(shù)爆炸式發(fā)展的今天俯萌,大數(shù)據(jù)已經(jīng)成為了繼云計(jì)算果录,物聯(lián)網(wǎng)后新的技術(shù)革命,關(guān)系型數(shù)據(jù)庫在處理大數(shù)據(jù)量時(shí)已經(jīng)開始吃力咐熙,開發(fā)者只能通過不斷地優(yōu)化數(shù)據(jù)庫來解決數(shù)據(jù)量的問題弱恒,但優(yōu)化畢竟不是一個(gè)長期方案,所以人們提出了一種新的數(shù)據(jù)庫解決方案來迎接大數(shù)據(jù)時(shí)代的到來——NoSQL(非關(guān)系型數(shù)據(jù)庫)棋恼,其中MongoDB數(shù)據(jù)庫就是其中的NoSQL的杰出代表返弹。在大數(shù)據(jù)時(shí)代中,大數(shù)據(jù)量的處理已經(jīng)成了考量一個(gè)數(shù)據(jù)庫最重要的原因之一蘸泻。而MongoDB的一個(gè)主要目標(biāo)就是盡可能的讓數(shù)據(jù)庫保持卓越的性能琉苇,這很大程度地決定了MongoDB的設(shè)計(jì)。
根據(jù)MongoDB官網(wǎng)的說明悦施,MongoDB的適用場景如下:
1)網(wǎng)站實(shí)時(shí)數(shù)據(jù):MongoDB非常適合實(shí)時(shí)的插入并扇,更新與查詢,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性抡诞。
2)數(shù)據(jù)緩存:由于性能很高穷蛹,MongoDB也適合作為信息基礎(chǔ)設(shè)施的緩存層土陪。在系統(tǒng)重啟之后,由MongoDB搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過載肴熏。
3)大尺寸鬼雀、低價(jià)值數(shù)據(jù)存儲(chǔ):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較昂貴,在此之前蛙吏,很多時(shí)候程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)源哩。
4)高伸縮性場景:MongoDB非常適合由數(shù)十或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫。MongoDB的路線圖中已經(jīng)包含對(duì)MapReduce引擎的內(nèi)置支持鸦做。
*************5)對(duì)象或JSON數(shù)據(jù)存儲(chǔ):MongoDB的BSON數(shù)據(jù)格式非常適合文檔化格式的存儲(chǔ)及查詢励烦。*****
MongoDB不適合使用場景如下:1)高度事務(wù)性系統(tǒng):例如銀行或會(huì)計(jì)系統(tǒng)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫目前還是更適用于需要大量原子性復(fù)雜事務(wù)的應(yīng)用程序泼诱。
2)傳統(tǒng)的商業(yè)智能應(yīng)用:針對(duì)特定問題的BI數(shù)據(jù)庫會(huì)對(duì)產(chǎn)生高度優(yōu)化的查詢方式坛掠。3)需要復(fù)雜SQL查詢的問題。
MongoDB大多數(shù)情況下治筒,可以代替關(guān)系型數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)庫業(yè)務(wù)屉栓。它更簡單更直接、更快速并且通常對(duì)應(yīng)用開發(fā)者的約束更少耸袜,不過缺乏事務(wù)支持需要慎重考慮業(yè)務(wù)需要友多。
2、MongoDB數(shù)據(jù)庫的安裝及基礎(chǔ)使用
MongoDB數(shù)據(jù)的官網(wǎng)為:https://www.mongodb.org/句灌,當(dāng)前版本為3.2夷陋,可以直接下載安裝版本在Linux或者Windows進(jìn)行安裝。
一般在Windows胰锌,我們默認(rèn)安裝的路徑為C:\Program Files\MongoDB,安裝后可以手動(dòng)創(chuàng)建一個(gè)放置數(shù)據(jù)庫和日志文件的目錄藐窄,一般不要放在C盤就好资昧,如下所示:
創(chuàng)建文件夾d:\mongodb\data\db、d:\mongodb\data\log荆忍,分別用來安裝db和日志文件格带,我們以后運(yùn)行數(shù)據(jù)庫后,這個(gè)目錄就用來放置我們創(chuàng)建的數(shù)據(jù)庫和日志資源了刹枉。
一般我們安裝后叽唱,為了在命令行方便調(diào)用Mongodb的命令,我們可以設(shè)置一個(gè)全局的路徑變量微宝,如下所示棺亭。
默認(rèn)情況下,mongodb的工作模式蟋软,是啟動(dòng)一個(gè)DOS窗口镶摘,運(yùn)行mongodb的數(shù)據(jù)庫服務(wù)嗽桩,一旦這個(gè)DOS窗口關(guān)閉,也就停止了相關(guān)的服務(wù)凄敢,在Windows平臺(tái)碌冶,我們可以把它寄宿在Windows服務(wù)里面,讓它隨著系統(tǒng)的啟動(dòng)而啟動(dòng)涝缝,也不必因?yàn)檎`關(guān)閉窗口而停止了數(shù)據(jù)庫服務(wù)了扑庞。
通過下面命令行執(zhí)行數(shù)據(jù)庫服務(wù)的處理。
mongod --dbpath "d:\mongodb\data\db" --logpath "d:\mongodb\data\log\MongoDB.log" --install --serviceName "MongoDB"
然后使用命令行啟動(dòng)服務(wù)
NET START MongoDB
創(chuàng)建服務(wù)并順利啟動(dòng)成功后拒逮,然后就可以在系統(tǒng)的服務(wù)列表里查看到了罐氨,我們確認(rèn)把它設(shè)置為自動(dòng)啟動(dòng)的Windows服務(wù)即可。
啟動(dòng)后消恍,我們可以在系統(tǒng)【運(yùn)行】里面直接使用命令mongo打開窗口就可以進(jìn)行相關(guān)的操作了岂昭。
上面用了一些常見的命令操作。
show dbs 顯示數(shù)據(jù)庫列表
use dbname 進(jìn)入dbname數(shù)據(jù)庫狠怨,大小寫敏感约啊,沒有這個(gè)數(shù)據(jù)庫也不要緊
show collections 顯示數(shù)據(jù)庫中的集合,相當(dāng)于表格
db.<collection_name>.find(); 集合查找方法佣赖,參考上面的方式恰矩,使用pretty()函數(shù)是排版更好看的意思。
而其中find方法很強(qiáng)大憎蛤,可以組合很多條件查詢的方式外傅,如下所示:
db.collection.find({ "key" : value }) 查找key=value的數(shù)據(jù)
db.collection.find({ "key" : { $gt: value } }) key > value
db.collection.find({ "key" : { $lt: value } }) key < value
db.collection.find({ "key" : { $gte: value } }) key >= value
db.collection.find({ "key" : { $lte: value } }) key <= value
db.collection.find({ "key" : { $gt: value1 , $lt: value2 } }) value1 < key <value2
db.collection.find({ "key" : { $ne: value } }) key <> value
db.collection.find({ "key" : { $mod : [ 10 , 1 ] } }) 取模運(yùn)算,條件相當(dāng)于key % 10 == 1 即key除以10余數(shù)為1的
db.collection.find({ "key" : { $nin: [ 1, 2, 3 ] } }) 不屬于俩檬,條件相當(dāng)于key的值不屬于[ 1, 2, 3 ]中任何一個(gè)
db.collection.find({ "key" : { $in: [ 1, 2, 3 ] } }) 屬于萎胰,條件相當(dāng)于key等于[ 1, 2, 3 ]中任何一個(gè)
db.collection.find({ "key" : { $size: 1 } }) $size 數(shù)量、尺寸棚辽,條件相當(dāng)于key的值的數(shù)量是1(key必須是數(shù)組技竟,一個(gè)值的情況不能算是數(shù)量為1的數(shù)組)
db.collection.find({ "key" : { $exists : true|false } }) $exists 字段存在,true返回存在字段key的數(shù)據(jù)屈藐,false返回不存在字度key的數(shù)據(jù)
db.collection.find({ "key": /^val.val$/i }) 正則榔组,類似like;“i”忽略大小寫联逻,“m”支持多行
db.collection.find({ $or : [{a : 1}, {b : 2} ] }) $or或 (注意:MongoDB 1.5.3后版本可用)搓扯,符合條件a=1的或者符合條件b=2的數(shù)據(jù)都會(huì)查詢出來
db.collection.find({ "key": value , $or : [{ a : 1 } , { b : 2 }] }) 符合條件key=value ,同時(shí)符合其他兩個(gè)條件中任意一個(gè)的數(shù)據(jù)
db.collection.find({ "key.subkey" :value }) 內(nèi)嵌對(duì)象中的值匹配包归,注意:"key.subkey"必須加引號(hào)
db.collection.find({ "key": { $not : /^val.val$/i } }) 這是一個(gè)與其他查詢條件組合使用的操作符锨推,不會(huì)單獨(dú)使用。上述查詢條件得到的結(jié)果集加上$not之后就能獲得相反的集合。
當(dāng)然還有插入更新的處理語句也是很特別的爱态。
db.student.insert({name:'student1',subject:['arts','music']})
db.users.update({"_id" : ObjectId("51826852c75fdd1d8b805801")}, {"$set" : {"hobby" :["swimming","basketball"]}} )
db.users.update({"_id" : ObjectId("51826852c75fdd1d8b805801")},{"$unset" : {"hobby" :1 }} )
db.posts.update({"_id" : ObjectId("5180f1a991c22a72028238e4")}, {"$inc":{"pageviews":1}})
db.students.update( { _id: 1 }, { $rename: { 'nickname': 'alias', 'cell': 'mobile' } }
upsert是一種特殊的更新操作谭贪,不是一個(gè)操作符。(upsert = up[date]+[in]sert)锦担,也就是如果存在則更新俭识,否則就寫入一條新的記錄操作。這個(gè)參數(shù)是個(gè)布爾類型洞渔,默認(rèn)是false套媚。
db.users.update({age :25}, {$inc :{"age" :3}}, true)
另外,Update可以對(duì)Json的集合進(jìn)行處理磁椒,如果對(duì)于subject對(duì)象是一個(gè)集合的話堤瘤,插入或更新其中的字段使用下面的語句
db.student.update({name:'student5'},{$set:{subject:['music']}},{upsert:true});
如果是記錄已經(jīng)存在,我們可以使用索引數(shù)值進(jìn)行更新其中集合里面的數(shù)據(jù)浆熔,如下所示本辐。
db.student.update({name:'student3'},{$set:{'subject.0':'arts'}});
如果我們先在集合里面增加一個(gè)記錄,而非替換的話医增,那么使用$push語句慎皱,如下面的語句所示。
db.student.update({name:'student3'},{$push:{'subject':'sports'}})
相反叶骨,如果要移除集合里面的某個(gè)值茫多,使用$pop操作符,那么語句如下所示
db.student.update({name:'student3'},{$pop:{'subject':1}});
其中索引為1標(biāo)識(shí)最右邊的記錄忽刽,-1標(biāo)識(shí)為最左邊的記錄天揖。
另外還可以使用**$pushAll
** 和$pullAll來增加/移除一個(gè)或多個(gè)集合記錄,如下代碼所示跪帝。
db.student.update({name:'student3'},{$**pushAll**:{'subject':['sports','craft']}})
db.student.update({name:'student3'},{$**pullAll**:{'subject':['sports','craft']}})
mongodb的數(shù)據(jù)庫的操作還是比較容易理解的今膊,具體可以進(jìn)一步參考官網(wǎng)里面的介紹。
https://docs.mongodb.org/manual/
https://docs.mongodb.org/getting-started/csharp/client/
http://mongodb.github.io/mongo-csharp-driver/2.2/
http://wiki.jikexueyuan.com/project/the-little-mongodb-book/
3伞剑、MongoDB數(shù)據(jù)庫的C#驅(qū)動(dòng)的使用
數(shù)據(jù)庫的C#驅(qū)動(dòng)使用介紹万细,可以參考:https://docs.mongodb.org/getting-started/csharp/,
或者http://mongodb.github.io/mongo-csharp-driver/2.2/纸泄,
可以下載相關(guān)的DLL然后在項(xiàng)目中引用,當(dāng)前的驅(qū)動(dòng)版本為2.2腰素,一般引入下面幾個(gè)DLL即可聘裁。
MongoDB.Bson.dll
MongoDB.Driver.dll
MongoDB.Driver.Core.dll
也可以使用VS工具的NugGet包進(jìn)行下載管理,如下所示弓千。
然后在彈出的NugGet程序包管理界面里面搜索mongo衡便,然后添加MongoDB.Driver的數(shù)據(jù)庫驅(qū)動(dòng)就可以使用了。
MongoDB數(shù)據(jù)庫驅(qū)動(dòng)在2.2版本(或者是從2.0開始)好像完全改寫了API的接口,因此目前這個(gè)版本同時(shí)支持兩個(gè)版本的API處理镣陕,一個(gè)是基于MongoDatabase的對(duì)象接口谴餐,一個(gè)是IMongoDatabase的對(duì)象接口,前者中規(guī)中矩呆抑,和我們使用Shell里面的命令名稱差不多岂嗓,后者IMongoDatabase的接口是基于異步的,基本上和前者差別很大鹊碍,而且接口都提供了異步的處理操作厌殉。后面我會(huì)分別對(duì)這兩個(gè)部分進(jìn)行詳細(xì)的介紹,本文基于篇幅的原因侈咕,介紹一下兩者的簡單差異就可以了公罕。
我們以Mongodb的數(shù)據(jù)庫連接字符串mongodb://localhost/local來進(jìn)行構(gòu)建
1)舊接口MongoDatabase對(duì)象的構(gòu)建
var client = new MongoClient(connectionString);
var database = client.GetServer().GetDatabase(new MongoUrl(connectionString).DatabaseName);
2)新接口IMongoDatabase對(duì)象的構(gòu)建
var client = new MongoClient(connectionString);
var database = client.GetDatabase(new MongoUrl(connectionString).DatabaseName);
后者已經(jīng)沒有了GetServer的接口了。
3)舊接口的查找對(duì)象處理
/// <summary>
/// 查詢數(shù)據(jù)庫,檢查是否存在指定ID的對(duì)象
/// </summary>
/// <param name="key">對(duì)象的ID值</param>
/// <returns>存在則返回指定的對(duì)象,否則返回Null</returns>
public virtual T FindByID(string id)
{
ArgumentValidation.CheckForEmptyString(id, "傳入的對(duì)象id為空");
MongoCollection<T> collection = GetCollection();
return collection.FindOneById(new ObjectId(id));
}
3)新接口查找對(duì)象的處理
/// <summary>
/// 查詢數(shù)據(jù)庫,檢查是否存在指定ID的對(duì)象
/// </summary>
/// <param name="key">對(duì)象的ID值</param>
/// <returns>存在則返回指定的對(duì)象,否則返回Null</returns>
public virtual T FindByID(string id)
{
ArgumentValidation.CheckForEmptyString(id, "傳入的對(duì)象id為空");
IMongoCollection<T> collection = GetCollection();
return collection.Find(s=> s.Id == id).FirstOrDefault();
}
新接口已經(jīng)沒有了FindOneById等接口了耀销,所有的操作基本上都通過Find方法進(jìn)行處理楼眷。舊接口很多通過Query對(duì)象進(jìn)行條件的查詢,新接口又換了一個(gè)對(duì)象進(jìn)行過濾條件處理了熊尉,總的來說罐柳,兩個(gè)接口差異非常大。
例如舊版本接口的Query使用C#代碼如下所示:
private void TestQuery()
{
Query.All("name", new List<BsonValue> { BsonValue.Create("a"), BsonValue.Create("b") });//通過多個(gè)元素來匹配數(shù)組
Query.And(Query.EQ("name", "a"), Query.EQ("title", "t"));//同時(shí)滿足多個(gè)條件
Query.Or(Query.EQ("name", "a"), Query.EQ("title", "t"));//滿足其中一個(gè)條件
Query.EQ("name", "a");//等于
Query.Exists("type");//判斷鍵值是否存在
Query.GT("value", 2);//大于>
Query.GTE("value", 3);//大于等于>=
Query.In("name", new List<BsonValue> { BsonValue.Create("a"), BsonValue.Create("b") });//包括指定的所有值,可以指定不同類型的條件和值
Query.LT("value", 9);//小于<
Query.LTE("value", 8);//小于等于<=
Query.Mod("value", 3, 1);//將查詢值除以第一個(gè)給定值,若余數(shù)等于第二個(gè)給定值則返回該結(jié)果
Query.NE("name", "c");//不等于
Query.Size("name", 2);//給定鍵的長度
Query.Type("_id", BsonType.ObjectId);//給定鍵的類型
Query.ElemMatch("children", Query.And( Query.EQ("name", "C3"), Query.EQ("value", "C")));
//Query.Nor(Array);//不包括數(shù)組中的值
//Query.Not("name");//元素條件語句
//Query.NotIn("name", "a", 2);//返回與數(shù)組中所有條件都不匹配的文檔
//Query.Where(BsonJavaScript);//執(zhí)行JavaScript
//Query.Matches("Title", str);//模糊查詢 相當(dāng)于sql中l(wèi)ike -- str可包含正則表達(dá)式
var keyword = "abc";
Query.Matches("Title", new BsonRegularExpression("/.*" + keyword + ".*/"));//模糊Like語法
//通過正則表達(dá)式 1開頭 第二位數(shù)0~9且只能一位數(shù)帽揪,也包含20
var queryName = Query.Matches("Name", new BsonRegularExpression("Donma1([0-9]{1,1})$|20"));
//查找年齡 >=10 且<=20
var queryAge = Query.And(Query.GTE("Age", 10), Query.LTE("Age", 20));
var entityQuery = Query<UserInfo>.EQ(e => e.Name, "wuhuacong");
var entityQuery2 = Query<UserInfo>.EQ(e => e.Id, "4B414D000000011613CD");
}
新版本的條件查詢硝清,則丟棄了Query這個(gè)對(duì)象,提供了FilterDefinition<T> 對(duì)象的處理转晰,估計(jì)是這個(gè)可以處理的更好吧芦拿,同時(shí)新接口全部支持異步的處理操作了。
如插入記錄的異步操作代碼如下所示查邢。
/// <summary>
/// 插入指定對(duì)象到數(shù)據(jù)庫中
/// </summary>
/// <param name="t">指定的對(duì)象</param>
public virtual async Task InsertAsync(T t)
{
ArgumentValidation.CheckForNullReference(t, "傳入的對(duì)象t為空");
IMongoCollection<T> collection = GetCollection();
await collection.InsertOneAsync(t);
}
好了蔗崎,基于篇幅的原因,把后面介紹的C#開發(fā)留到下一篇進(jìn)行介紹扰藕,希望本篇文章對(duì)大家了解mongodb數(shù)據(jù)庫缓苛,以及如何在C#上面使用該數(shù)據(jù)庫提供了一個(gè)簡要的指引,希望大家多多支持邓深。