.Net Core 3.0 對 MongoDB 的多條件(兩種)查詢操作

2022-11-04 21:00:56

前言

  在日常開發中,偶爾會用到 MongoDB 的資料操作,也花費了一些時間偵錯,因此在此處記錄一下,共同進步。

廢話少說,出招吧!

正文

2.1 準備工作

首先需要引入 .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:與表欄位完全一致的物件,取值方便
    }
}

 2.2 資料存取--獲取 Json 物件

直接上程式碼,看註釋即可:

(傳入的查詢條件,需要和資料庫中的型別匹配)(若通過 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;
}

 2.3 資料存取--獲取指定物件型別

 此方案中的查詢字串和上一章節是有區別的,具體如下:

 (查詢條件先拼接成 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>,可以直接跟屬性取值,更方便
}

 注:暫列這兩種查詢吧,後續繼續補充,有問題歡迎指正。