2

MongoDB用来存储我的应用程序数据。现在我想根据 MongoDB 表中 Array 对象的过滤器获取数据。如下图所示在此处输入图像描述

这是我的桌子tblEmployee。我想找到那些GroupList字段包含 value的记录Group5。当我在 mongodb 表中插入这些记录时,我将其存储Dictionary<string,dynamic>C#如下代码。

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”字符串)

任何帮助或建议将不胜感激。

谢谢。

4

2 回答 2

1

这个过滤器

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"});

AnyIn编辑:如评论中所述 -在这种特定情况下 (for )似乎Dictionary<string, dynamic>仅适用于旧版本的 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" ] }
于 2018-02-14T07:57:49.750 回答
1

如果可能,我建议不要使用动态类型,因为 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" ] }
于 2018-02-14T07:58:17.183 回答