MongoDB從不懂到裝懂其二(C#操作MongoDB)
阿新 • • 發佈:2018-12-24
上一篇文件講述了在命令視窗下的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));
}
當然,還有一些其他的方法,比如說獲取資料庫集合大小,增加資料庫索引等操作,詳見上面貼出來的例子裡的程式碼吧。