在C# MongoDB中筛选包含指定全部订单的用户列表
C# MongoDB 子列表全匹配查询实现
现有模型定义
User模型
public class User { public int Id { get; set; } public string Name { get; set; } public List<UserOrder> Orders { get; set; } }
UserOrder模型
public class UserOrder { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public string Description { get; set; } }
Order模型
public class Order { public int Name { get; set; } public decimal Price { get; set; } }
查询需求
在C# MongoDB驱动中,检索所有用户,要求其Orders子列表包含外部传入的Order列表中的全部元素,匹配规则为同时匹配Name和Price字段。
实现方案
要满足该需求,需通过MongoDB的ElemMatch操作符实现子文档的多字段匹配,再用And组合所有匹配条件,确保传入的每个Order都能在用户的Orders列表中找到对应项。
代码示例
using MongoDB.Driver; // 假设已获取MongoDB的User集合实例 var userCollection = database.GetCollection<User>("Users"); // 外部传入的目标订单列表 List<Order> targetOrders = new List<Order> { new Order { Name = 1001, Price = 99.9m }, new Order { Name = 1002, Price = 199.9m } }; // 为每个目标订单构建匹配条件:在用户Orders中找到Name和Price都匹配的子项 var filterDefinitions = targetOrders.Select(order => Builders<User>.Filter.ElemMatch( user => user.Orders, Builders<UserOrder>.Filter.And( Builders<UserOrder>.Filter.Eq(uo => uo.Name, order.Name.ToString()), // 注意类型转换:Order.Name是int,UserOrder.Name是string Builders<UserOrder>.Filter.Eq(uo => uo.Price, order.Price) ) ) ); // 组合所有条件,必须全部满足 var combinedFilter = Builders<User>.Filter.And(filterDefinitions); // 执行查询并获取结果 var matchingUsers = userCollection.Find(combinedFilter).ToList();
关键说明
- 类型兼容处理:
Order的Name为int类型,UserOrder的Name为string类型,需做类型转换,若业务中两者类型一致可省略转换步骤。 - 子文档精准匹配:使用
ElemMatch确保单个子文档同时满足Name和Price的匹配要求,避免出现跨子文档的字段误匹配。 - 全量匹配保证:通过
And组合所有ElemMatch条件,确保只有包含所有目标订单的用户才会被检索出来。
内容的提问来源于stack exchange,提问作者Dishank Patil
相关产品推荐
相关产品推荐

