在日常開發中,偶爾會用到 MongoDB 的資料操作,也花費了一些時間偵錯,因此在此處記錄一下,共同進步。
廢話少說,出招吧!
首先需要引入 .Net 平臺連結 MongoDB 的動態庫:MongoDB.Driver;
然後建立預設 DBContext 實體類:
(將資料庫以及表的資訊引入到系統中備用,資料庫連結資訊最好是放置在組態檔中,便於不同環境靈活設定,次非本文重點就直接預設了)
using MongoDB.Bson;
using MongoDB.Driver;
namespace DBContext.DataBase
{
public class MongoDBContextDefault
{
//連線地址
private static string conn = "mongodb://0.0.0.0:0000";
//連線伺服器端
static MongoClient client_pub = new MongoClient(conn);
//資料庫名稱
private static string dbName = "MongDBName";
//集合名稱
private static string collName_Table1 = "Table1";
private static string collName_Table2 = "Table2";
//獲取指定資料庫
static IMongoDatabase db_Test = client_pub.GetDatabase(dbName);
//獲取指定集合 BsonDocument資料庫檔案物件
public static IMongoCollection<BsonDocument> colle_Table1 = db_Test.GetCollection<BsonDocument>(collName_Table1);// BsonDocument:最終會以 Json 物件來取值
public static IMongoCollection<Table2Model> colle_Table2Model = db_Test.GetCollection<Table2Model>(collName_Table2);// Table2Model:與表欄位完全一致的物件,取值方便
}
}
直接上程式碼,看註釋即可:
(傳入的查詢條件,需要和資料庫中的型別匹配)(若通過 ID 查詢,需要將條件值轉為 Guid 型別)
using DBContext.DataBase;
using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
using Newtonsoft.Json.Linq;
public List<JObject> GetValues(string name, string id)
{
FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter;
DateTime startTime = DateTime.Now.AddDays(-7);//只同步最近七天有更新的流程
FilterDefinition<BsonDocument> filter = builderFilter.And(builderFilter.Eq("name", name), // 多條件查詢
builderFilter.Eq("id", new Guid(id)), // id 需要轉換成 Guid 型別
builderFilter.Gte("stime", startTime)); // Time 需要是 DateTime 型別
var result = MongoDBContextDefault.colle_ProcInstData.Find<BsonDocument>(filter).ToList(); // 獲取資料
List<JObject> jTokens = new List<JObject>();
var setjson = new JsonWriterSettings
{
OutputMode = JsonOutputMode.Strict
};
foreach (var item in result) // 逐個轉為 JObject,備用(後續迴圈,可以直接通過 JObjectItem["name"] 進行取值)
{
JObject item_jo = JObject.Parse(item.ToJson(setjson));
jTokens.Add(item_jo);
}
return jTokens;
}
此方案中的查詢字串和上一章節是有區別的,具體如下:
(查詢條件先拼接成 json 字串,再轉 BsonDocument 物件)
public void Method(string name,string id)
{
DateTime dtcondition = DateTime.Now.AddDays(-7);
// 時間上差一個月,所以月份 -1 // 具體原因未知。。。待後續補充
string strdate = $"new Date({dtcondition.Year},{dtcondition.Month - 1},{dtcondition.Day})";
string querystr = $"{{$and:[{{'name':'{name}'}}" +
$",{{'id':CSUUID('{id}')}}" + // 另一種根據 ID 查詢方式
$",{{'time':{{$gte:{strdate}}}}}]}}";
var querycon = BsonSerializer.Deserialize<BsonDocument>(querystr);
var dataresult = MongoDBContextDefault.colle_Table2.Find(querycon).ToList();
// 這裡的 dataresult 結果型別是 List<Table2Model>,可以直接跟屬性取值,更方便
}
注:暫列這兩種查詢吧,後續繼續補充,有問題歡迎指正。