You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:40:32