天天看點

Net Core 3.0 對 MongoDB 的多條件查詢

作者:中年農碼工

閱讀目錄

  • 前言
  • 正文2.1 準備工作 2.2 資料通路--擷取 Json 對象 2.3 資料通路--擷取指定對象類型

回到頂部

前言

  在日常開發中,偶爾會用到 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 = #34;new Date({dtcondition.Year},{dtcondition.Month - 1},{dtcondition.Day})"; 
    string querystr = #34;{{$and:[{{'name':'{name}'}}" +
        #34;,{{'id':CSUUID('{id}')}}" + // 另一種根據 ID 查詢方式
        #34;,{{'time':{{$gte:{strdate}}}}}]}}";
    var querycon = BsonSerializer.Deserialize<BsonDocument>(querystr);
    var dataresult = MongoDBContextDefault.colle_Table2.Find(querycon).ToList();
    // 這裡的 dataresult 結果類型是 List<Table2Model>,可以直接跟屬性取值,更友善
}           

注:有問題歡迎指正。