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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:10:30