詳解MongoDB for C#基礎(chǔ)入門(mén)
筆者這里采用的是mongoDB官網(wǎng)推薦使用.net驅(qū)動(dòng):
http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/
有關(guān)于MongoDB的安裝讀者可以參考其他的博客,對(duì)于基本的學(xué)習(xí)來(lái)說(shuō)并不需要進(jìn)行過(guò)多的配置。
創(chuàng)建連接
這一步驟跟ADO.NET連接到數(shù)據(jù)庫(kù)的步驟是一樣的,ADO.NET是利用SqlConnection連接數(shù)據(jù)庫(kù),而MongoDB則使用MongoClient連接,并在構(gòu)造函數(shù)中將連接字符傳遞進(jìn)去,當(dāng)然可以不傳遞,那么默認(rèn)就是連接本地的計(jì)算機(jī)的默認(rèn)端口(27017),比如下面的三種連接方式:
var client = new MongoClient();
var client1 = new MongoClient("mongodb://localhost:27017");
var client2 = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019");
獲取數(shù)據(jù)庫(kù)
為了獲取數(shù)據(jù)庫(kù),只需要調(diào)用MongoClient對(duì)象的GetDatabase方法,并傳入數(shù)據(jù)庫(kù)名稱即可,如果數(shù)據(jù)庫(kù)存在則直接返回,否則就創(chuàng)建該數(shù)據(jù)庫(kù)并返回,比如下面的這段代碼將創(chuàng)建名為“foo”的數(shù)據(jù)庫(kù):
var database = client.GetDatabase("foo");
現(xiàn)在database變量就指向了foo數(shù)據(jù)庫(kù)了。
獲取鏈表
雖然叫獲取鏈表,但是實(shí)際上就是獲取數(shù)據(jù)庫(kù)中的表,我們可以通過(guò)上面database的GetCollection<TDocument>方法獲取,比如下面的代碼我們將獲取一個(gè)名為“bar”的表:
var collection = database.GetCollection<BsonDocument>("bar");
我們傳入的泛型參數(shù)為BsonDocument,這個(gè)是自帶的,可以動(dòng)態(tài)的容納各種格式的數(shù)據(jù),當(dāng)然這里還是建議讀者使用POCO。
插入一個(gè)文檔
利用collection對(duì)象,我們可以將文檔插入其中,比如下面的json格式數(shù)據(jù):
{
"name": "MongoDB",
"type": "database",
"count": 1,
"info": {
x: 203,
y: 102
}
}
下面我們利用BsonDocument對(duì)象組織上面的JSON格式的數(shù)據(jù):
var document = new BsonDocument
{
{"name","MongoDB"},
{"type","Database"},
{"count",1},
{"info",new BsonDocument{
{"x",203},
{"y",102}
}
}
};
然后我們利用collection對(duì)象的InsertOneAsync將上面的數(shù)據(jù)插入其中:
collection.InsertOneAsync(doc);
我們都知道Async為后綴的方法都是支持異步的,但是筆者是在控制臺(tái)項(xiàng)目中演示的所以沒(méi)有加上這個(gè)await,如果讀者實(shí)在其他的環(huán)境中測(cè)試的可以根據(jù)情況加上。
插入多個(gè)文檔
如果需要一次性插入多個(gè)文檔,我們可以通過(guò)InsertManyAsync方法,比如下面的示例我們將插入100條數(shù)據(jù):
var documents = Enumerable.Range(0, 100).Select(x => new BsonDocument("counter", x));
collection.InsertManyAsync(documents);
統(tǒng)計(jì)文檔數(shù)量
通過(guò)上面的步驟我們已經(jīng)插入了101條數(shù)據(jù),如果在實(shí)際開(kāi)發(fā)中我們需要統(tǒng)計(jì)數(shù)據(jù)的數(shù)量就可以通過(guò)調(diào)用CountAsync方法,比如下面的代碼:
var count = collection.CountAsync(new BsonDocument()); Console.WriteLine(count.Result);
查詢鏈表
利用Find方法我們可以對(duì)鏈表進(jìn)行查詢,F(xiàn)ind方法將返回給我們IFindFluent<TDocument,TProjection>對(duì)象,該接口屬于鏈?zhǔn)浇涌?,所以能夠提供給我們類(lèi)似jquery那樣的鏈?zhǔn)阶兂煞绞饺タ刂撇樵儾僮鳌?/p>
查詢鏈表首條數(shù)據(jù)
為了獲取第一條數(shù)據(jù)我們可以通過(guò)調(diào)用FirstOrDefaultAsync方法,該方法會(huì)返回第一條數(shù)據(jù),如果不存在數(shù)據(jù)則會(huì)返回null,比如下面的代碼將會(huì)顯示鏈表中的第一條數(shù)據(jù):
var firstDoc = collection.Find(new BsonDocument()).FirstOrDefaultAsync(); Console.WriteLine(firstDoc.Result.ToString());
如果讀者注意最后的輸出,會(huì)發(fā)現(xiàn)一個(gè)_id字段,但是我們并沒(méi)有插入這個(gè)字段,這個(gè)字段是mongoDB自動(dòng)加入的,相信很多人都知道它的作用,這里就不詳細(xì)解釋額。
查詢鏈表中所有數(shù)據(jù)
如果想將鏈表中所有的數(shù)據(jù)都返回可以在Find操作之后調(diào)用ToListAsync方法就可以,將會(huì)直接返回List<T>類(lèi)型的結(jié)果,比如下面的這段代碼:
var documents = collection.Find(new BsonDocument()).ToListAsync().Result;
針對(duì)數(shù)量較少的數(shù)據(jù)情況下,上面這種方式是沒(méi)有問(wèn)題,但如果我們需要處理大量的數(shù)據(jù),那么我們就不能使用上面的這種方式,就需要利用下面的方式,通過(guò)ForEachAsync來(lái)完成,因?yàn)檫@個(gè)方法會(huì)在每條數(shù)據(jù)返回的時(shí)候執(zhí)行一個(gè)回調(diào),從而達(dá)到并發(fā)處理的目的,比如下面這段代碼就演示了如何使用:
collection.Find(new BsonDocument()).ForEachAsync(x => Console.WriteLine(x));
通過(guò)條件查詢單條數(shù)據(jù)
我們可以在調(diào)用Find方法的時(shí)候傳入一個(gè)過(guò)濾條件,從而在鏈表中查詢我們希望的數(shù)據(jù),比如下面這個(gè)例子我們將查詢字段“counter”的值為71的數(shù)據(jù):
var filter = Builders<BsonDocument>.Filter.Eq("counter", 71);
var document = collection.Find(filter).FirstAsync().Result;
Console.WriteLine(document);
這里我們需要通過(guò)Builders的靜態(tài)對(duì)象Filter中的各種條件方法來(lái)構(gòu)造條件,然后在調(diào)用Find方法的將其傳入即可。
通過(guò)條件查詢多條數(shù)據(jù)
我們也可以獲取多條數(shù)據(jù),比如下面這個(gè)例子,我們將搜索出所有“counter”的值大于50的數(shù)據(jù):
var filter = Builders<BsonDocument>.Filter.Gt("counter", 50);
var document = collection.Find(filter).ForEachAsync(x => Console.WriteLine(x));
當(dāng)然我們也可以給定一個(gè)范圍,比如50到70之間:
var filterBuilder = Builders<BsonDocument>.Filter;
var filter = filterBuilder.Gt("counter", 50) & filterBuilder.Lt("counter", 70);
collection.Find(filter).ForEachAsync(x => Console.WriteLine(x));
對(duì)數(shù)據(jù)排序
下面我們將在查詢的基礎(chǔ)之上加上排序,排序只需要在在調(diào)用Sort方法時(shí)傳入對(duì)應(yīng)的參數(shù)即可,比如下面的例子,我們將對(duì)鏈表先進(jìn)行查詢,然后排序:
var filter = Builders<BsonDocument>.Filter.Exists("counter");
var sort = Builders<BsonDocument>.Sort.Descending("counter");
var documnt = collection.Find(filter).Sort(sort).FirstAsync().Result;
對(duì)字段投射
許多時(shí)候我們并不需要文檔中的所有數(shù)據(jù),這就好比在SQL中我們都會(huì)只把我們需要的數(shù)據(jù)select出來(lái),而不會(huì)把表中的所有字段的數(shù)據(jù)都拿出來(lái),自然MongoDB也可以讓我這樣做,我們只需要跟過(guò)濾和排序一樣利用Projection構(gòu)造器來(lái)構(gòu)造然后傳遞給Project方法中就可以了,下面這個(gè)例子中我們將排除“_id”字段:
var projection = Builders<BsonDocument>.Projection.Exclude("_id");
var document = collection.Find(new BsonDocument()).Project(projection).FirstAsync().Result;
Console.WriteLine(document);
更新文檔
MongoDB擁有很多更新操作,下面我們將會(huì)介紹幾個(gè)簡(jiǎn)單的并且常用的更新操作。
如果我們需要更新一個(gè)對(duì)象(如果條件不匹配那么可能是0條),可以使用UpdateOneAsync方法,并執(zhí)行過(guò)濾條件和需要更新到的文檔,比如下面我們將“counter”為1的數(shù)據(jù)中的“counter”更新為110:
var filter = Builders<BsonDocument>.Filter.Eq("counter", 1);
var updated = Builders<BsonDocument>.Update.Set("counter", 110);
var result = collection.UpdateOneAsync(filter, updated).Result;
如果我們需要批量的更新,我們可以調(diào)用UpdateManyAsync即可。比如我們需要將“counter”小于10的數(shù)據(jù)中的“counter”累加100,那么我們就可以像下面這樣來(lái)寫(xiě):
var filter = Builders<BsonDocument>.Filter.Lt("counter", 10);
var updated = Builders<BsonDocument>.Update.Inc("counter", 100);
var result = collection.UpdateManyAsync(filter, updated).Result;
刪除文檔
作為基礎(chǔ)部分這也是最后一個(gè)部分了,利用上面的過(guò)濾,然后調(diào)用DeleteOneAsync或DeleteManyAsync方法就可以了,比如下面的列子就是刪除“counter”大于100的所有數(shù)據(jù):
var filter = Builders<BsonDocument>.Filter.Gt("counter", 100);
var resut = collection.DeleteManyAsync(filter).Result;
到此為止,MongoDB的基礎(chǔ)部分就結(jié)束了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
實(shí)例分享C#中Explicit和Implicit用法
本篇文章主要給讀者們分享了C#中Explicit和Implicit的用法,對(duì)此有需求和興趣的朋友們一起學(xué)習(xí)下吧。2017-12-12
C#實(shí)現(xiàn)簡(jiǎn)單成績(jī)管理系統(tǒng)的完整步驟
這篇文章主要給大家介紹了關(guān)于C#實(shí)現(xiàn)簡(jiǎn)單成績(jī)管理系統(tǒng)的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
C#通過(guò)第三方組件生成二維碼(QR Code)和條形碼(Bar Code)
用C#如何生成二維碼,我們可以通過(guò)現(xiàn)有的第三方dll直接來(lái)實(shí)現(xiàn),下面列出幾種不同的生成方法2016-12-12
C#實(shí)現(xiàn)根據(jù)數(shù)字序號(hào)輸出星期幾的簡(jiǎn)單實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)根據(jù)數(shù)字序號(hào)輸出星期幾的簡(jiǎn)單實(shí)例,代碼簡(jiǎn)潔實(shí)用,也有助于初學(xué)者更好的理解C#的switch和if語(yǔ)句的流程控制,需要的朋友可以參考下2014-07-07
Win10 系統(tǒng)下VisualStudio2019 配置點(diǎn)云庫(kù) PCL1.11.0的圖文教程
這篇文章主要介紹了Win10 系統(tǒng)下VisualStudio2019 配置點(diǎn)云庫(kù) PCL1.11.0的圖文教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07

