C# Mongo FilterBuilder实现嵌套对象数组属性多值匹配筛选
解决方案
你可以通过MongoDB C#驱动内置的Filter构建器组合ElemMatch和In两个操作符实现需求,不需要写复杂的聚合管道,构建完成的过滤器可以直接用于Find查询。
实现代码
using MongoDB.Bson; using MongoDB.Driver; using System.Collections.Generic; // 传入的名称筛选集合 IEnumerable<string> filterArray = new [] { "testuser@test.com", "sampleuser@test.com" }; // 构建FilterDefinition var filterBuilder = Builders<BsonDocument>.Filter; var filter = filterBuilder.ElemMatch( field: "users", filter: filterBuilder.In("name", filterArray) ); // 执行查询,返回结果和预期完全一致 var matchedDocs = await mongoColletion.Find(filter).ToListAsync();
逻辑说明
ElemMatch针对数组类型字段users做匹配:只要数组内存在至少一个元素满足传入的子条件,当前父文档就会被命中- 子条件用
In操作符判断数组元素的name属性值是否存在于传入的filterArray集合中,命中任意一个值就算满足条件
上述代码生成的原生MongoDB查询语句等价于:
{ "users": { "$elemMatch": { "name": { "$in": ["testuser@test.com", "sampleuser@test.com"] } } } }
针对你给出的示例数据:
- 第一个文档的users数组存在
sampleuser@test.com,命中筛选 - 第二个文档的users数组存在
testuser@test.com,命中筛选 - 第三个文档的users数组只有
anotheruser@test.com,不在筛选列表内,不会被返回
最终返回结果和你预期的文档集合完全一致。
内容的提问来源于stack exchange,提问作者DaveVentura
相关产品推荐
相关产品推荐

