基于C#的MongoDB數(shù)據(jù)庫開發(fā)應(yīng)用(1)--MongoDB數(shù)據(jù)庫的基礎(chǔ)知識(shí)和使用

在花了不少時(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è)簡要的指引,希望大家多多支持邓深。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末未桥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芥备,更是在濱河造成了極大的恐慌冬耿,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萌壳,死亡現(xiàn)場離奇詭異亦镶,居然都是意外死亡日月,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門缤骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爱咬,“玉大人,你說我怎么就攤上這事绊起【猓” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵勒庄,是天一觀的道長串前。 經(jīng)常有香客問我实蔽,道長,這世上最難降的妖魔是什么局装? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮铐尚,結(jié)果婚禮上拨脉,老公的妹妹穿的比我還像新娘宣增。我一直安慰自己,他們只是感情好爹脾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布帖旨。 她就那樣靜靜地躺著灵妨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泌霍。 梳的紋絲不亂的頭發(fā)上货抄,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音朱转,去河邊找鬼蟹地。 笑死,一個(gè)胖子當(dāng)著我的面吹牛藤为,可吹牛的內(nèi)容都是我干的锈津。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼凉蜂,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窿吩,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤茎杂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纫雁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煌往,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年轧邪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刽脖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忌愚,死狀恐怖曲管,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硕糊,我是刑警寧澤院水,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站简十,受9級(jí)特大地震影響檬某,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜螟蝙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一恢恼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胰默,春花似錦场斑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碟刺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間半沽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工浩村, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人占哟。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓酿矢,卻偏偏與公主長得像怎燥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铐姚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一、MongoDB簡介 1.概述 ? MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫之众,由C++語言編寫。旨在為WE...
    鄭元吉閱讀 974評(píng)論 0 2
  • 一棺禾、Mongodb數(shù)據(jù)庫 Day01 1.課程介紹 數(shù)據(jù)庫概述(了解) NoSQL和MongoDB簡介(了解) M...
    滿天繁星_28c5閱讀 485評(píng)論 0 5
  • 一悍手、MongoDB簡介 概述MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,由C++語言編寫坦康。旨在為WEB應(yīng)用提供...
    王梓懿_1fbc閱讀 489評(píng)論 0 3
  • 一、MongoDB簡介 概述MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫滞欠,由C++語言編寫。旨在為WEB應(yīng)用提供...
    EndEvent閱讀 1,159評(píng)論 1 4
  • 一筛璧、MongoDB簡介 概述MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫,由C++語言編寫夭谤。旨在為WEB應(yīng)用提供...
    慕楊_閱讀 551評(píng)論 0 4