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

C# MongoDB驱动聚合查询$concat操作符报错仅支持字符串不支持数组

问题根因
  • $lookup 操作返回的结果默认是数组类型,你两次关联查询生成的asDivisons、asCompany字段都是数组,而非单个对象。你直接调用$asCompany._id取值时,实际获取到的是所有匹配的Company记录的_id组成的数组,而非单个值,$concat运算符仅支持字符串类型入参,传入数组就会触发类型不匹配错误。
  • 如果你的_id是MongoDB默认的ObjectId类型,本身不属于字符串类型,即使拿到单个_id值,也需要先转为字符串才能参与$concat拼接。
修复方案

方案1:拆分数组后投影(适用于一对多关联场景)

在两次Lookup后分别添加Unwind操作,将数组拆分为单个对象,保证asCompany是单个对象后再做投影:

var joinresult3 = userCollection.Aggregate()
    .Match(user => user.Id == userId)
    .Lookup("Division", "Divisions.DivisionId", "_id", "asDivisons")
    // 拆分Division结果数组
    .Unwind("asDivisons")
    .Lookup("Company", "asDivisons.CompanyId", "_id", "asCompany")
    // 拆分Company结果数组
    .Unwind("asCompany")
    .Project(project)
    .ToList();

同时修改投影逻辑,将_id转为字符串后再拼接:

var project = new BsonDocument
{
    { "Id" , "$asCompany._id"}, 
    { "Code" , "$asCompany.Code"}, 
    { "Name" , "$asCompany.Name"}, 
    { "Address" , "$asCompany.Address"},
    // 先转_id为字符串再拼接
    { "ConcurrencyId" , new BsonDocument{ { "$concat", new BsonArray{  "1_3_", new BsonDocument("$toString", "$asCompany._id") } } } }
};

方案2:直接取数组首元素(适用于仅匹配单条记录场景)

如果业务上确认关联查询只会返回1条匹配结果,可以直接取数组的第一个元素避免拆分操作,修改投影逻辑即可:

var project = new BsonDocument
{
    { "Id" , new BsonDocument("$first", "$asCompany._id")}, 
    { "Code" , new BsonDocument("$first", "$asCompany.Code")}, 
    { "Name" , new BsonDocument("$first", "$asCompany.Name")}, 
    { "Address" , new BsonDocument("$first", "$asCompany.Address")},
    { "ConcurrencyId" , new BsonDocument{ { "$concat", new BsonArray{  
        "1_3_", 
        new BsonDocument("$toString", new BsonDocument("$first", "$asCompany._id")) 
    } } } }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 19:33:03