如何用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
相关产品推荐
相关产品推荐

