詳解MongoDB for C#基礎入門_C#教程

來源:互聯網
上載者:User

筆者這裡採用的是mongoDB官網推薦使用.net驅動:

http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/

有關於MongoDB的安裝讀者可以參考其他的部落格,對於基本的學習來說並不需要進行過多的配置。

建立串連

這一步驟跟ADO.NET串連到資料庫的步驟是一樣的,ADO.NET是利用SqlConnection串連資料庫,而MongoDB則使用MongoClient串連,並在建構函式中將串連字元傳遞進去,當然可以不傳遞,那麼預設就是串連本地的電腦的預設連接埠(27017),比如下面的三種串連方式:

var client = new MongoClient();var client1 = new MongoClient("mongodb://localhost:27017");var client2 = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019");

擷取資料庫

為了擷取資料庫,只需要調用MongoClient對象的GetDatabase方法,並傳入資料庫名稱即可,如果資料庫存在則直接返回,否則就建立該資料庫並返回,比如下面的這段代碼將建立名為“foo”的資料庫:

var database = client.GetDatabase("foo");

現在database變數就指向了foo資料庫了。 

擷取鏈表

雖然叫擷取鏈表,但是實際上就是擷取資料庫中的表,我們可以通過上面database的GetCollection<TDocument>方法擷取,比如下面的代碼我們將擷取一個名為“bar”的表:

var collection = database.GetCollection<BsonDocument>("bar");

我們傳入的泛型參數為BsonDocument,這個是內建的,可以動態容納各種格式的資料,當然這裡還是建議讀者使用POCO。

 插入一個文檔

利用collection對象,我們可以將文檔插入其中,比如下面的json格式資料:

{   "name": "MongoDB",   "type": "database",   "count": 1,   "info": {     x: 203,     y: 102   }}

下面我們利用BsonDocument對象組織上面的JSON格式的資料:

var document = new BsonDocument{  {"name","MongoDB"},  {"type","Database"},  {"count",1},  {"info",new BsonDocument{     {"x",203},     {"y",102}    }  }};

然後我們利用collection對象的InsertOneAsync將上面的資料插入其中:

collection.InsertOneAsync(doc);

我們都知道Async為尾碼的方法都是支援非同步,但是筆者是在控制台項目中示範的所以沒有加上這個await,如果讀者實在其他的環境中測試的可以根據情況加上。

 插入多個文檔

如果需要一次性插入多個文檔,我們可以通過InsertManyAsync方法,比如下面的樣本我們將插入100條資料:

var documents = Enumerable.Range(0, 100).Select(x => new BsonDocument("counter", x));collection.InsertManyAsync(documents);

統計文檔數量

通過上面的步驟我們已經插入了101條資料,如果在實際開發中我們需要統計資料的數量就可以通過調用CountAsync方法,比如下面的代碼:

var count = collection.CountAsync(new BsonDocument());Console.WriteLine(count.Result);

查詢鏈表

利用Find方法我們可以對鏈表進行查詢,Find方法將返回給我們IFindFluent<TDocument,TProjection>對象,該介面屬於鏈式介面,所以能夠提供給我們類似jquery那樣的鏈式變成方式去控制查詢操作。

查詢鏈表首條資料

為了擷取第一條資料我們可以通過調用FirstOrDefaultAsync方法,該方法會返回第一條資料,如果不存在資料則會返回null,比如下面的代碼將會顯示鏈表中的第一條資料:

var firstDoc = collection.Find(new BsonDocument()).FirstOrDefaultAsync();Console.WriteLine(firstDoc.Result.ToString());

如果讀者注意最後的輸出,會發現一個_id欄位,但是我們並沒有插入這個欄位,這個欄位是mongoDB自動加入的,相信很多人都知道它的作用,這裡就不詳細解釋額。

 查詢鏈表中所有資料

如果想將鏈表中所有的資料都返回可以在Find操作之後調用ToListAsync方法就可以,將會直接返回List<T>類型的結果,比如下面的這段代碼:

var documents = collection.Find(new BsonDocument()).ToListAsync().Result;

針對數量較少的資料情況下,上面這種方式是沒有問題,但如果我們需要處理大量的資料,那麼我們就不能使用上面的這種方式,就需要利用下面的方式,通過ForEachAsync來完成,因為這個方法會在每條資料返回的時候執行一個回調,從而達到並發處理的目的,比如下面這段代碼就示範了如何使用:

collection.Find(new BsonDocument()).ForEachAsync(x => Console.WriteLine(x));

通過條件查詢單條資料

我們可以在調用Find方法的時候傳入一個過濾條件,從而在鏈表中查詢我們希望的資料,比如下面這個例子我們將查詢欄位“counter”的值為71的資料:

var filter = Builders<BsonDocument>.Filter.Eq("counter", 71);var document = collection.Find(filter).FirstAsync().Result;Console.WriteLine(document);

這裡我們需要通過Builders的靜態對象Filter中的各種條件方法來構造條件,然後在調用Find方法的將其傳入即可。

 通過條件查詢多條資料

我們也可以擷取多條資料,比如下面這個例子,我們將搜尋出所有“counter”的值大於50的資料:

var filter = Builders<BsonDocument>.Filter.Gt("counter", 50);var document = collection.Find(filter).ForEachAsync(x => Console.WriteLine(x));

當然我們也可以給定一個範圍,比如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));

對資料排序

下面我們將在查詢的基礎之上加上排序,排序只需要在在調用Sort方法時傳入對應的參數即可,比如下面的例子,我們將對鏈表先進行查詢,然後排序:

var filter = Builders<BsonDocument>.Filter.Exists("counter");var sort = Builders<BsonDocument>.Sort.Descending("counter");var documnt = collection.Find(filter).Sort(sort).FirstAsync().Result;

對欄位投射

許多時候我們並不需要文檔中的所有資料,這就好比在SQL中我們都會只把我們需要的資料select出來,而不會把表中的所有欄位的資料都拿出來,自然MongoDB也可以讓我這樣做,我們只需要跟過濾和排序一樣利用Projection構造器來構造然後傳遞給Project方法中就可以了,下面這個例子中我們將排除“_id”欄位:

var projection = Builders<BsonDocument>.Projection.Exclude("_id");var document = collection.Find(new BsonDocument()).Project(projection).FirstAsync().Result;Console.WriteLine(document);

更新文檔

MongoDB擁有很多更新操作,下面我們將會介紹幾個簡單的並且常用的更新操作。

如果我們需要更新一個對象(如果條件不匹配那麼可能是0條),可以使用UpdateOneAsync方法,並執行過濾條件和需要更新到的文檔,比如下面我們將“counter”為1的資料中的“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;

如果我們需要批量的更新,我們可以調用UpdateManyAsync即可。比如我們需要將“counter”小於10的資料中的“counter”累加100,那麼我們就可以像下面這樣來寫:

var filter = Builders<BsonDocument>.Filter.Lt("counter", 10);var updated = Builders<BsonDocument>.Update.Inc("counter", 100);var result = collection.UpdateManyAsync(filter, updated).Result;

刪除文檔

作為基礎部分這也是最後一個部分了,利用上面的過濾,然後調用DeleteOneAsync或DeleteManyAsync方法就可以了,比如下面的列子就是刪除“counter”大於100的所有資料:

var filter = Builders<BsonDocument>.Filter.Gt("counter", 100);var resut = collection.DeleteManyAsync(filter).Result;

到此為止,MongoDB的基礎部分就結束了。希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.