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

如何将MongoDB $split转换为C# MongoDriver等效实现?

错误原因

你当前写法运行报错的核心原因是:Lambda表达式形式的.Project()默认会按照普通对象映射规则解析匿名类型里的属性值,不会自动将你手动构造的BsonDocument识别为MongoDB聚合运算符,最终生成的$project管道不符合预期语法,自然会抛出运行时错误。

可用的正确写法

以下两种写法都能准确生成你需要的$project聚合阶段,可根据自己的编码习惯选择:

写法1:直接传BsonDocument定义投影(全版本驱动兼容,和原生MongoDB语法完全对齐,零解析偏差)

完全对应你写的原生聚合代码,不需要依赖驱动的LINQ解析规则,是最稳妥的实现:

.Project(new BsonDocument
{
    { "_id", 1 },
    { "ContractId", 1 },
    { "DomainParts", new BsonDocument("$split", new BsonArray { "$Email", "@" }) }
})

写法2:强类型Lambda写法(适合偏好LINQ编码风格的场景,要求MongoDB C# Driver版本≥2.10)

不要手动构造BsonDocument嵌入匿名对象,使用驱动内置的Mql工具类调用$split聚合运算符即可:

// 先引入对应命名空间
using MongoDB.Driver.Linq;

// 假设你的集合实体类定义如下,实际替换为你自己的实体即可
public class ContractEntity
{
    public ObjectId _id { get; set; }
    public string ContractId { get; set; }
    public string Email { get; set; }
}

// 投影阶段代码
.Project(e => new
{
    _id = e._id,
    ContractId = e.ContractId,
    DomainParts = Mql.Fields.String.Split(e.Email, "@")
})

注意:强类型投影下不需要给_id、ContractId赋值为1,直接映射实体对应字段,驱动会自动生成保留这两个字段的配置。如果强行赋值为1,反而会被驱动解析成新增一个值为1的常量字段,和预期逻辑不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:24:26