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

