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

如何用C# MongoDB Driver查询Tags数组含指定姓名对象的MongoDB文档

用C# MongoDB Driver查询数组中匹配多属性的文档

嘿,这个问题我刚好熟!要实现你说的需求,核心是用MongoDB的$elemMatch操作符,它专门用来匹配数组中存在同时满足多个条件的元素的文档——刚好对应你要找Tags数组里同一个对象的first_name和last_name都匹配的场景。

下面分两种常见场景给你代码示例:

1. 使用强类型模型(推荐)

首先假设你已经定义了对应MongoDB文档的C#模型:

// 对应你的根文档
public class MyDocument
{
    public string Id { get; set; }
    // 其他属性...
    public List<Tag> Tags { get; set; }
}

// 对应Tags数组里的元素
public class Tag
{
    [BsonElement("first_name")]
    public string FirstName { get; set; }
    
    [BsonElement("last_name")]
    public string LastName { get; set; }
    
    [BsonElement("alive")]
    public bool Alive { get; set; }
}

注意这里用[BsonElement]特性来映射MongoDB里的蛇形命名字段和C#的驼峰命名属性,避免字段名不匹配的问题。

接下来构建查询并执行:

// 初始化MongoDB客户端、数据库和集合
var mongoClient = new MongoClient("你的MongoDB连接字符串");
var db = mongoClient.GetDatabase("你的数据库名称");
var collection = db.GetCollection<MyDocument>("你的集合名称");

// 定义要匹配的目标姓名
var targetFirstName = "jack";
var targetLastName = "john";

// 构建过滤器:用ElemMatch指定Tags数组中存在一个元素同时满足两个条件
var filter = Builders<MyDocument>.Filter.ElemMatch(
    doc => doc.Tags,
    tag => tag.FirstName == targetFirstName && tag.LastName == targetLastName
);

// 执行查询,获取匹配的文档列表
var matchingDocs = await collection.Find(filter).ToListAsync();

2. 使用BsonDocument(无强类型模型)

如果你不想定义强类型模型,直接用BsonDocument来构建查询也是可以的:

var mongoClient = new MongoClient("你的MongoDB连接字符串");
var db = mongoClient.GetDatabase("你的数据库名称");
var collection = db.GetCollection<BsonDocument>("你的集合名称");

var targetFirstName = "jack";
var targetLastName = "john";

// 直接构建Bson格式的过滤器,对应MongoDB的$elemMatch语法
var filter = new BsonDocument
{
    {
        "Tags", new BsonDocument
        {
            {
                "$elemMatch", new BsonDocument
                {
                    { "first_name", targetFirstName },
                    { "last_name", targetLastName }
                }
            }
        }
    }
};

var matchingDocs = await collection.Find(filter).ToListAsync();

关键注意点

  • 为什么不用普通的And过滤器?如果直接写Builders<MyDocument>.Filter.And(...)分别匹配Tags.first_name和Tags.last_name,会匹配到数组中不同元素分别满足条件的文档(比如一个Tag的first_name是jack,另一个Tag的last_name是john),这不是你要的结果。
  • ElemMatch会确保匹配的是同一个数组元素同时满足所有指定条件,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Anoop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:38:22