如何在 C# 中使用 Mongodb.Driver 对 MongoDb table 中的数组对象应用过滤器?
How to apply filter on Array object in MongoDb table using Mongodb.Driver in C#?
我正在使用 MongoDB
来存储我的应用程序数据。现在我想根据 MongoDB table 中数组对象的过滤器获取数据。如下图所示
这是我的 table tblEmployee
。我想找到那些 GroupList
字段包含值 Group5
的记录。当我在 mongodb table 中插入这些记录时,我将其存储为 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
我没有记录,它应该 return 我在上图中突出显示的一条记录(记录编号 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" ] }
我正在使用 MongoDB
来存储我的应用程序数据。现在我想根据 MongoDB table 中数组对象的过滤器获取数据。如下图所示
这是我的 table tblEmployee
。我想找到那些 GroupList
字段包含值 Group5
的记录。当我在 mongodb table 中插入这些记录时,我将其存储为 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
我没有记录,它应该 return 我在上图中突出显示的一条记录(记录编号 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" ] }