如何在C# MongoDB驱动的Fluent聚合中匹配两个字段?
解决C# MongoDB Driver Fluent聚合中匹配两个字段相等的问题
问题原因
你之前的代码.Match( x => x["SubField"] == x["SubFields.Field"])无法工作,是因为Linq表达式会将其解析为客户端内存中的值比较,而不是生成MongoDB所需的$expr聚合表达式来执行文档内部字段的对比。
解决方案
根据是否使用强类型实体类,有两种实现方式:
1. 强类型实体类场景
假设你定义了对应文档的实体类:
public class ProductDocument { public string Product { get; set; } public string SubField { get; set; } public string ShortDescription { get; set; } public string LongDescription { get; set; } public SubFields SubFields { get; set; } } public class SubFields { public string Field { get; set; } }
使用Builders<T>.Filter.Expr构建字段间的相等匹配:
var result = collection.Aggregate() .Match(Builders<ProductDocument>.Filter.Expr( doc => doc.SubField == doc.SubFields.Field )) .ToList();
2. 弱类型(BsonDocument)场景
如果不需要强类型实体,直接使用BsonDocument操作:
var filter = Builders<BsonDocument>.Filter.Expr( BsonDocument.Parse("{ $eq: ['$SubField', '$SubFields.Field'] }") ); var result = collection.Aggregate() .Match(filter) .ToList();
验证效果
上述两种方式都会生成你在Studio 3T中使用的正确Match阶段:
{ "$expr": { "$eq": ["$SubField", "$SubFields.Field"] } }
能够正确筛选出SubField与SubFields.Field值相等的文档(比如示例中的PROD2)。
内容的提问来源于stack exchange,提问作者Yaakov Umansky
相关产品推荐
相关产品推荐

