簡體   English   中英

如何在C#中使用Mongodb.Driver在MongoDb表中的Array對象上應用過濾器?

[英]How to apply filter on Array object in MongoDb table using Mongodb.Driver in C#?

我正在使用MongoDB來存儲我的應用程序數據。 現在,我想基於MongoDB表中Array對象上的過濾器來獲取數據。 正如你在下面的圖片中看到的 在此處輸入圖片說明

這是我的表tblEmployee 我想找到那些記錄GroupList字段包含值Group5 那時,當我在mongodb表中插入這些記錄時,我將其從C#代碼存儲為Dictionary<string,dynamic> ,如下所示。

var clientTest = new MongoClient("mongodb://localhost:XXXX");
var dbTest = clientTest.GetDatabase("Test_DB");
var collectionTest = dbTest.GetCollection<Dictionary<string, dynamic>>("tblEmployee"); 
Dictionary<string, dynamic> obj = new Dictionary<string, dynamic>();
string[] items = { "Group1", "Group2", "Group5", "Group6" };
obj.Add("_id", Guid.NewGuid());
obj.Add("FirstName", "Carlton");
...// Other Props and Values
obj.Add("GroupList", items); // Here value type is String Array.
await collectionTest.InsertOneAsync(obj);

現在,我嘗試使用下面的代碼根據需要讀取基於過濾器的數據。

var clientTest = new MongoClient("mongodb://localhost:XXXX");
                var dbTest = clientTest.GetDatabase("Test_DB");
                var collectionTest = dbTest.GetCollection<Dictionary<string, dynamic>>("tblEmployee");
                var builder = Builders<Dictionary<string, dynamic>>.Filter;
                var filter = builder.AnyIn("GroupList", "Group5"); // Used AnyIn to create IN filter for Array object
                var allDataObj = await collectionTest.FindAsync(filter);
                var allDataList = allDataObj.ToList(); 

但是,在allDataList我沒有記錄,它應該返回一個記錄(記錄編號4),該記錄已在上圖中突出顯示。

請給我建議如何構建包含特定值的數組對象的過濾器(在我的情況下,包含“ Group5”字符串的數組)

任何幫助或建議,將不勝感激。

謝謝。

這個過濾器

builder.AnyIn("GroupList", "Group5");

將數組視為字符數組,而不是字符串,因為您未提供泛型類型,並且將其推斷為char (因為"Group5"字符串為IEnumerable<char> )。 因此,產生的查詢不是您期望的。 要將數組視為字符串數組,您需要構建如下的過濾器:

var filter = builder.AnyIn("GroupList", new [] {"Group5"});

但是,您可能會從屏幕快照中注意到,實際值不是存儲在GroupList屬性中,而是存儲在GroupList > _v更深層中,因此正確的查詢應為:

var filter = builder.AnyIn("GroupList._v", new [] {"Group5"});

編輯:如評論中所述-在這種情況下(對於Dictionary<string, dynamic> ), AnyIn似乎僅在較舊版本的C#驅動程序中有效,而在較新版本中,它會產生奇怪的異常。 如果您使用的是最新版本的C#驅動程序-請使用其他答案的建議:

var filter = builder.Eq( "GroupList._v", "Group5"); // query will be { GroupList._v: "Group5" }
var filter = builder.In("GroupList._v", new [] { "Group5" }); // query will be { GroupList._v: { $in: [ "Group5" ] }

我建議不要使用動態類型,因為MongoDB驅動程序根本無法推斷他正在處理的類型。

以下兩個版本在您的特定情況下給出正確的結果:

var filter = builder.Eq( "GroupList._v", "Group5"); // query will be { GroupList._v: "Group5" }
var filter = builder.In("GroupList._v", new [] { "Group5" }); // query will be { GroupList._v: { $in: [ "Group5" ] }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM