MongoDB for C#基礎入門

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

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

有關於MongoDB的安裝讀者能夠參考其餘的博客,對於基本的學習來講並不須要進行過多的配置。github

 

建立鏈接

這一步驟跟ADO.NET鏈接到數據庫的步驟是同樣的,ADO.NET是利用SqlConnection鏈接數據庫,而MongoDB則使用MongoClient鏈接,並在構造函數中將鏈接字符傳遞進去,固然能夠不傳遞,那麼默認就是鏈接本地的計算機的默認端口(27017),好比下面的三種鏈接方式:mongodb

1 var client = new MongoClient();
2 
3 var client1 = new MongoClient("mongodb://localhost:27017");
4 
5 var client2 = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019");

 

 

獲取數據庫

爲了獲取數據庫,只須要調用MongoClient對象的GetDatabase方法,並傳入數據庫名稱便可,若是數據庫存在則直接返回,不然就建立該數據庫並返回,好比下面的這段代碼將建立名爲「foo」的數據庫:數據庫

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

如今database變量就指向了foo數據庫了。json

 

獲取鏈表

雖然叫獲取鏈表,可是實際上就是獲取數據庫中的表,咱們能夠經過上面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;

 

 

刪除文檔

做爲基礎部分這也是最後一個部分了,利用上面的過濾,而後調用DeleteOneAsyncDeleteManyAsync方法就能夠了,好比下面的列子就是刪除「counter」大於100的全部數據:

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

 

 

 

到此爲止,MongoDB的基礎部分就結束了。

相關文章
相關標籤/搜索