1. 程式人生 > >MongoDB從不懂到裝懂其二(C#操作MongoDB)

MongoDB從不懂到裝懂其二(C#操作MongoDB)

上一篇文件講述了在命令視窗下的MongoDB的相關操作,這一篇講述C#語言環境下MongoDB的使用。

注意在執行這個例子的時候,首先要按照例子中的資料庫名稱和表單名稱來新建資料庫和表單。同時開啟資料庫伺服器。

驅動下載之後,在檔案中新增引用就行了。下面詳細講解使用方法。

step 1:資料庫基本設定,獲取資料庫和資料庫伺服器例項

這裡可以新建一個類,專門用來放置資料庫的一些設定細節。如下所示,每一條語句的作用都作了說明。

    internal sealed class MongoDB
    {
        //資料庫所在主機的埠
        private readonly int MONGO_CONN_PORT = 27017;

        //設定連線超時15秒
        private readonly int CONNECT_TIME_OUT = 15;

        //設定最大連線數
        private readonly int MAXConnectionPoolSize = 99;

        //設定最小連線數
        private readonly int MINConnectionPoolSize = 1;

        /// <summary>
        /// 獲得資料庫例項
        /// </summary>
        /// <param name="MONGO_CONN_HOST">資料庫主機連結</param>
        /// <param name="DB_Name">資料庫名稱</param>
        /// <returns>資料庫例項</returns>
        public MongoDatabase GetDataBase(string MONGO_CONN_HOST, string DB_Name)
        {
            MongoClientSettings mongoSetting = new MongoClientSettings();

            mongoSetting.ConnectTimeout = new TimeSpan(CONNECT_TIME_OUT * TimeSpan.TicksPerSecond);  //設定超時連線

            mongoSetting.Server = new MongoServerAddress(MONGO_CONN_HOST, MONGO_CONN_PORT);  //設定資料庫伺服器

            mongoSetting.MaxConnectionPoolSize = MAXConnectionPoolSize;  //設定最大連線數
            mongoSetting.MinConnectionPoolSize = MINConnectionPoolSize;  //設定最小連線數

            MongoClient client = new MongoClient(mongoSetting);  //建立Mongo客戶端

            return client.GetServer().GetDatabase(DB_Name);  //得到伺服器端並生成資料庫例項
        }


        /// <summary>
        /// 得到資料庫伺服器
        /// </summary>
        /// <param name="MONGO_CONN_HOST">資料庫主機連結</param>
        /// <returns>資料庫伺服器例項</returns>
        public MongoServer GetDataBaseServer(string MONGO_CONN_HOST)
        {
            MongoClientSettings mongoSetting = new MongoClientSettings();

            mongoSetting.ConnectTimeout = new TimeSpan(CONNECT_TIME_OUT * TimeSpan.TicksPerSecond);  //設定超時連線

            mongoSetting.Server = new MongoServerAddress(MONGO_CONN_HOST, MONGO_CONN_PORT);  //設定資料庫伺服器

            mongoSetting.MaxConnectionPoolSize = MAXConnectionPoolSize;  //設定最大連線數
            mongoSetting.MinConnectionPoolSize = MINConnectionPoolSize;  //設定最小連線數

            MongoClient client = new MongoClient(mongoSetting);  //建立MongoDB客戶端

            return client.GetServer();
        }
    }


step 2:建立一個MongoDBHelper檔案,用於例項化資料庫,同時進行增刪改查的相關方法實現

首先是例項的建立,定義資料庫例項和資料庫伺服器例項,在建構函式中完成建立

        /// <summary>
        /// 資料庫的例項
        /// </summary>
        public MongoDatabase _db;
        
        /// <summary>
        /// 得到資料庫伺服器
        /// </summary>
        private MongoServer _dbServer;

        /// <summary>
        /// ObjectId的鍵
        /// </summary>
        private readonly string OBJECTID_KEY = "_id";

        //初始化建構函式
        public MongoDBHelper(string MONGO_CONN_HOST, string DB_Name)
        {
            this._db = new MongoDB().GetDataBase(MONGO_CONN_HOST, DB_Name);
            this._dbServer = new MongoDB().GetDataBaseServer(MONGO_CONN_HOST);
        }


接下來討論增刪改查方法的實現,首先是插入資料,插入資料分為單條插入和批量插入。批量插入的時候直接使用List型別。這裡需要注意的是型別T。這個型別可以是基本資料型別,包括String,int,List,Dictionary,HashSet等,也可以是預定義的資料型別
        /// <summary>
        /// 將資料插入進資料庫
        /// </summary>
        /// <typeparam name="T">需要插入資料庫的實體型別</typeparam>
        /// <param name="t">需要插入資料庫的具體實體</param>
        /// <param name="collectionName">指定插入的集合</param>
        public void Insert<T>(T t, string collectionName)
        {
            MongoCollection<BsonDocument> mc = this._db.GetCollection<BsonDocument>(collectionName);

            //將實體轉換為bson文件
            BsonDocument bd = t.ToBsonDocument();

            //進行插入操作
            WriteConcernResult result = mc.Insert(bd);
            if (!string.IsNullOrEmpty(result.ErrorMessage))
            {
                throw new Exception(result.ErrorMessage);
            }

        }

        /// <summary>
        /// 批量插入資料
        /// </summary>
        /// <typeparam name="T">需要插入資料庫的實體型別</typeparam>
        /// <param name="list">需要插入資料的列表</param>
        /// <param name="collectionName">指定要插入的集合</param>
        public void Insert<T>(List<T> list, string collectionName)
        {
            MongoCollection<BsonDocument> mc = this._db.GetCollection<BsonDocument>(collectionName);
            
            //建立一個空間bson集合
            List<BsonDocument> bsonList = new List<BsonDocument>();
            
            //批量將資料轉為bson格式 並且放進bson文件,lambda表示式
            list.ForEach(t => bsonList.Add(t.ToBsonDocument()));
            
            //批量插入資料
            mc.InsertBatch(bsonList);
        }


刪除資料的操作,可以分為按照查詢條件刪除和全部刪除

        /// <summary>
        /// 移除指定的資料
        /// </summary>
        /// <typeparam name="T">移除的資料型別</typeparam>
        /// <param name="query">移除的資料條件</param>
        /// <param name="collectionName">指定的集合名詞</param>
        public void Remove<T>(IMongoQuery query, string collectionName)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);

            query = this.InitQuery(query);
            //根據指定查詢移除資料
            mc.Remove(query);
        }

        /// <summary>
        /// 移除實體裡面所有的資料
        /// </summary>
        /// <typeparam name="T">移除的資料型別</typeparam>
        /// <param name="collectionName">指定的集合名稱</param>
        public void RemoveAll<T>(string collectionName)
        {
            this.Remove<T>(null, collectionName);
        }

查詢資料的操作比較多一些,因為在讀庫的時候也比較常用。這裡給出幾個方法,分別是:查詢資料庫中所有記錄,按條件查詢多個記錄,按條件查詢一個記錄(第一個找到的) 以及查詢指定欄位的記錄

        /// <summary>
        /// 查詢一個集合中的所有資料
        /// </summary>
        /// <typeparam name="T">該集合資料的所屬型別</typeparam>
        /// <param name="collectionName">指定集合的名稱</param>
        /// <returns>返回一個List列表</returns>
        public List<T> FindAll<T>(string collectionName)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            //以實體方式取出其資料集合
            MongoCursor<T> mongoCursor = mc.FindAll();
            //直接轉化為List返回
            return mongoCursor.ToList<T>();
        }



        /// <summary>
        /// 查詢指定欄位的所有資料
        /// </summary>
        /// <typeparam name="T">資料型別</typeparam>
        /// <param name="collectionName">資料表名稱</param>
        /// <param name="fd">欄位區間定義</param>
        /// <returns></returns>
        public List<T> FindAll<T>(string collectionName, FieldsDocument fd)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            //以實體方式取出其資料集合
            MongoCursor<T> mongoCursor = mc.FindAll().SetFields(fd);
            //直接轉化為List返回
            return mongoCursor.ToList<T>();
        }




        /// <summary>
        /// 查詢一條記錄
        /// </summary>
        /// <typeparam name="T">該資料所屬的型別</typeparam>
        /// <param name="query">查詢的條件 可以為空</param>
        /// <param name="collectionName">去指定查詢的集合</param>
        /// <returns>返回一個實體型別</returns>
        public T FindOne<T>(IMongoQuery query, string collectionName)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            query = this.InitQuery(query);
            T t = mc.FindOne(query);
            return t;
        }

        /// <summary>
        /// 根據指定條件查詢集合中的多條資料記錄
        /// </summary>
        /// <typeparam name="T">該集合資料的所屬型別</typeparam>
        /// <param name="query">指定的查詢條件 比如Query.And(Query.EQ("username","admin"),Query.EQ("password":"admin"))</param>
        /// <param name="collectionName">指定的集合的名稱</param>
        /// <returns>返回一個List列表</returns>
        public List<T> Find<T>(IMongoQuery query, string collectionName)
        {
            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            query = this.InitQuery(query);

            MongoCursor<T> mongoCursor = mc.Find(query);

            return mongoCursor.ToList<T>();
        }

最後,來說一下更新資料的操作,更新比較簡單,這裡給出一種更新方法
        /// <summary>
        /// 更新資料
        /// </summary>
        /// <typeparam name="T">更新的資料 所屬的型別</typeparam>
        /// <param name="query">更新資料的查詢</param>
        /// <param name="update">需要更新的文件</param>
        /// <param name="collectionName">指定更新集合的名稱</param>
        public void Update<T>(IMongoQuery query, BsonDocument bd, string collectionName)
        {

            MongoCollection<T> mc = this._db.GetCollection<T>(collectionName);
            query = this.InitQuery(query);

            mc.Update(query, new UpdateDocument(bd));
        }


當然,還有一些其他的方法,比如說獲取資料庫集合大小,增加資料庫索引等操作,詳見上面貼出來的例子裡的程式碼吧。