MongoDB入門 (3)

by vivid 13. 七月 2016 00:38

.NET Magazine國際中文電子雜誌
作 者:許薰尹
審 稿:張智凱
文章編號:
N160717301
出刊日期:2016/7/13
資料庫:MongoDB v3.2.4、MongoDB.Driver v2.2.4

本篇文章將延續前兩篇《MongoDB入門 (1)》、《MongoDB入門 (2)》文章的內容,介紹如何透過.NET Framework,以C#程式碼來存取MongoDB資料庫中的內容,你可以利用MongoDB語言驅動程式所提供的屬性和分法,來查詢資料庫中集合內的文件,並針對集合中的文件進行新增、刪除、修改、與查詢的動作。

下載語言驅動程式

要在C#專案中存取MongoDB資料庫,需要透過MongoDB語言驅動程式,在本文撰寫時最新版本為2.2.4版,若要查詢最新版,可以參考官網網頁進行下載:

http://mongodb.github.io/mongo-csharp-driver/?_ga=1.148966769.674217283.1464248053

直接下載的網址如下:

https://github.com/mongodb/mongo-csharp-driver/releases/download/v2.2.4/CSharpDriver-2.2.4.zip

不過,若透過Visual Studio工具進行開發,可以直接使用工具進行下載。

建立C#專案

本文將介紹以主控台應用程式來存取MongoDB 資料。讓我們先啟動Visual Studio 2015開發環境,從「File」-「New」-「Project」,在「New Project」對話方塊中,「Templates」選取「Visual C#」-「Windows」分類,選取「Console Application」,建立一個主控台應用程式,並設定專案名稱:

clip_image002

圖 1:建立一個主控台應用程式。

使用Nuget套件管理員下載「MongoDb.Driver」函式庫。在「Solution Explorer」視窗選取專案名稱。從Visual Studio 2015開發工具「Tools」-「NuGet Package Manager」-「Package Manager Console」開啟「Package Manager Console」視窗,然後在提示字元中輸入install-package指令,並使用「-version」指定安裝2.2.4版本:

install-packag MongoDB.Driver –version 2.2.4

另一種作法是使用圖型介面做安裝,在「Solution Explorer」視窗,點選專案,按滑鼠右鍵,從快捷選單選取「Manage NuGet Packages」選單:

clip_image004

圖 2:使用圖型介面安裝「MongoDb.Driver」函式庫。

接著,就會出現NuGet Package Manager視窗,在上方的文字方塊中輸入搜尋關鍵字,找到MongoDB.Driver套件後,從下拉式清單方塊選取想要安裝的版本,再點選右方的「Install」按鈕進行安裝(注意,你的電腦必需先連上網際網路,才能夠進行下載套件的動作):

clip_image006

圖 2:安裝MongoDB.Driver。

待相關的套件安裝完成之後,就可以開始撰寫程式碼了。

新增Document到集合

我們在主控台程式中加入以下程式碼,在程式上方先引用MongoDB.Bson、MongoDB.Driver等命名空間,在Main方法中加入程式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            MongoClient client = new MongoClient("mongodb://127.0.0.1:27017/myTestDb");
            IMongoDatabase db = client.GetDatabase("myTestDb");
            var employees = db.GetCollection<BsonDocument>("employees");

            BsonDocument employee = new BsonDocument(){
                {"name", "mary"},
                { "age",40},
                { "email", "mary@test.com" },
                { "department", new BsonDocument(){
                    { "code", 100},
                    { "name", "Sales"}
                }
            }};

            employees.InsertOne(employee);
            Console.WriteLine("inserted!");
            Console.ReadLine();
        }
    }
}

 

範例中使用MongoClient類別來連接到MongoDB 伺服器,預設MongoClient會自動建立並管理連線集區(Connection Pool)。MongoClient類別的GetDatabase方法可以存取到指定的資料庫。若資料庫此時不存在也沒有關係,MongoDB會在第一次使用時,自動建立資料庫。IMongoDatabase介面的GetCollection<BsonDocument>方法可以取得指定的集合。取得集合物件之後,就可以新增文件到集合之中。我們建立一個BsonDocument物件代表要新增的文件,再叫用InsertOne方法,將文件新增到集合之中。InsertOne方法用來新增一份文件,它是以同步方式進行新增,另有一個InsertOneAsync方法,則支援非同步執行。若要新增多份文件,可以參考InsertMany方法(同步),或InsertManyAsync(非同步):方法。

當程式成功地將資料新增到資料庫後,我們可以利用mongo.exe工具連接到資料庫,觀察一下執行結果,使用use指令,連結到myTestDb資料庫,再叫用db.employees.find()方法,查詢集合中現有的文件:

C:\Program Files\MongoDB\Server\3.2\bin>mongo

MongoDB shell version: 3.2.4

connecting to: test

> use myTestDb

switched to db myTestDb

> db.employees.find()

{ "_id" : ObjectId("573edf31589eec01c0e77551"), "name" : "mary", "age" : 40, "email" : "mary@test.com", "department" : { "code" : 100, "name" : "Sales" } }

這個範例的執行結果,請參考下圖所示:

clip_image008

圖 3:查詢新增的資料。

查詢集合中的文件-非同步

FindAsync方法可以使用非同步的方式查詢集合中的文件,參考以下範例程式碼,叫用FindAsync方法取得Cursor,Cursor類似一個指標,可以讓你將查詢的文件一一讀取出來,範例中利用迴圈將文件讀出,只要叫用MoveNextAsync()方法,就移動Cursor到下一份文件,將文件內容印出。另外利用一個counter變數來計算資料的筆數:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Query();
            Console.ReadLine();
        }
        static async void Query() {
            MongoClient client = new MongoClient("mongodb://127.0.0.1:27017/myTestDb");
            IMongoDatabase db = client.GetDatabase("myTestDb");
            var employees = db.GetCollection<BsonDocument>("employees");

            var filter = new BsonDocument();
            var count = 0;
            using (var cursor = await employees.FindAsync(filter))
            {
                while (await cursor.MoveNextAsync())
                {
                    var batch = cursor.Current;
                    foreach (var document in batch)
                    {
                        Console.WriteLine(document);
                        count++;
                    }
                }
            }
            Console.WriteLine();
            Console.WriteLine($"Total Count : {count}");
            Console.ReadLine();
        }
     
    }
}

 

這個範例的執行結果,請參考下圖所示:

clip_image010

圖 4:使用Cursor讀取查詢的結果。

查詢集合中的文件-同步

Find方法可以使用同步的方式查詢集合中的文件。若想要取回某個集合中所有的文件,只要在叫用Find方法後,直接叫用ToList方法。待資料傳回之後,我們可以利用foreach迴圈,將文件一一讀出,叫用GetValue方法可以讀出文件中的欄位(Field),或是利用 [ ] 來讀取內容,參考以下範例程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Query();
            Console.ReadLine();
        }
        static  void Query() {
            MongoClient client = new MongoClient("mongodb://127.0.0.1:27017/myTestDb");
            IMongoDatabase db = client.GetDatabase("myTestDb");
            var filter = new BsonDocument();
            var employees = db.GetCollection<BsonDocument>("employees").Find(new BsonDocument()).ToList();


            foreach (var employee in employees)
            {
                Console.WriteLine("_id : "+ employee.GetValue("_id"));
                Console.WriteLine("name : "+ employee["name"]);
                Console.WriteLine("age : " + employee["age"]);
                Console.WriteLine("email : " + employee["email"]);
                Console.WriteLine("department code : " + employee["department"]["code"]);
                Console.WriteLine("department name : " + employee["department"]["name"]);

                Console.WriteLine("==================================");
            }
            Console.ReadLine();
        }
      
    }
}

 

這個範例的執行結果,請參考下圖所示:

clip_image012

圖 5:讀取文件內容。

取代現有的文件

MongoDB提供多種資料修改的方法,包含同步、非同步方法。ReplaceOne(同步)與ReplaceOneAsync(非同步)可以代換掉集合中現有的文件。以下範例程式碼利用filter找尋「_id」為「573edf31589eec01c0e77551」的這份文件,然後叫用ReplaceOne方法將文件取代掉:

 

using System;
using System.Collections.Generic;

using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            MongoClient client = new MongoClient("mongodb://127.0.0.1:27017/myTestDb");
            IMongoDatabase db = client.GetDatabase("myTestDb");
            var employees = db.GetCollection<BsonDocument>("employees");

            BsonDocument employee = new BsonDocument(){
                {"name", "candy"},
                { "age", 50},
                { "email", "candy@test.com" },
                { "department", new BsonDocument(){
                    { "code", 200},
                    { "name", "Accounter"}
                }
            }};

            var filter = Builders<BsonDocument>.Filter.Eq("_id", new ObjectId("573edf31589eec01c0e77551"));
            employees.ReplaceOne(filter, employee);
            Console.WriteLine("Updated!");
            Console.ReadLine();
        }
    }
}

取代文件時,可以利用新文件順便新增欄位,或修改欄位的值,這個範例的執行結果,請參考下圖所示,在執行程式更新之前與之後的資料狀態如下:

clip_image014

圖 6:取代既有的文件。

更新文件

更新文件有許多方法可以叫用,UpdateOne(同步)與UpdateOneAsync(非同步)用來更新一份文件;UpdateMany(同步)與UpdateManyAsync(非同步)用來一次更新多份文件,若只想樣更新文件中部分欄位的值,可以利用Update方法,搭配Set方法設定欄位值,以下範例程式利用Update將「name」欄位設定為「LiLi」;將「age」設定為「20」;利用Filter篩選出 _id相符的資料,最後透過UpdateOne寫回資料庫:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            MongoClient client = new MongoClient("mongodb://127.0.0.1:27017/myTestDb");
            IMongoDatabase db = client.GetDatabase("myTestDb");
            var employees = db.GetCollection<BsonDocument>("employees");

            var update = Builders<BsonDocument>.Update
                .Set("name", "LiLi")
                .Set("age",20);

            var filter = Builders<BsonDocument>.Filter.Eq("_id", new ObjectId("573edf31589eec01c0e77551"));
            var result = employees.UpdateOne(filter, update);

            Console.WriteLine("Updated!");
            Console.ReadLine();
        }
    }
}

 

這個範例的執行結果,請參考下圖所示,在執行程式更新之前與之後的資料狀態如下:

clip_image016

圖 7:更新文件的欄位。

刪除文件

刪除一份文件可以利用DeleteOne(同步)或DeleteOneAsync(非同步)方法;DeleteMany(同步)與DeleteManyAsync(非同步)用來一次刪除多份文件。以下範例程式碼利用Filter篩選出_id相符的資料,然後將此份文件從資料庫刪除:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Driver;
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            MongoClient client = new MongoClient("mongodb://127.0.0.1:27017/myTestDb");
            IMongoDatabase db = client.GetDatabase("myTestDb");
            var employees = db.GetCollection<BsonDocument>("employees");

            var filter = Builders<BsonDocument>.Filter.Eq("_id", new ObjectId("573edf31589eec01c0e77551"));
            var result = employees.DeleteOne(filter);

            Console.WriteLine("Deleted! Delete Count :" + result.DeletedCount);
            Console.ReadLine();
        }
    }
}

這個範例的執行結果,請參考下圖所示,DeleteResult的DeletedCount屬性可以取得被刪除的資料筆數:

clip_image018

圖 8:資料刪除作業。

Tags:

.NET Magazine國際中文電子雜誌 | C# | MongoDB

新增評論




  Country flag
biuquote
  • 評論
  • 線上預覽
Loading






NET Magazine國際中文電子雜誌

NET Magazine國際中文電子版雜誌,由恆逸資訊創立於2000,自發刊日起迄今已發行超過500篇.NET相關技術文章,擁有超過40000名註冊讀者群。NET Magazine國際中文電子版雜誌希望藉於電子雜誌與NET Developer達到共同學習與技術新知分享,歡迎每一位對.NET 技術有興趣的朋友們多多支持本雜誌,讓作者群們可以有持續性的動力繼續爬文。<請加入免費訂閱>

月分類Month List