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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:21:30