MongoDB聚合管道为$$Maincode内置变量赋值时报错如何解决
问题原因
- 异常触发的核心是MongoDB的用户自定义变量命名不符合规则:MongoDB要求
$lookup的let阶段声明的自定义变量,必须以字母或下划线开头,不能以数字、小数点等特殊字符开头。 - 你代码中的错误点在
let对应的BsonDocument构造部分:你使用了C#变量Maincode、ColorCode作为自定义变量的键名,而这两个变量的运行时值是20.296这类开头为数字、包含小数点的字符串,自然不符合变量命名规则,触发报错。
修复方案
将let阶段的键替换为你后续pipeline中实际引用的、符合命名规则的字符串常量即可,你后续$match中引用的是$$Maincode和$$Renkcode,对应修改后的代码如下:
var lookup = new BsonDocument("$lookup", new BsonDocument { {"from","DepoStatus" }, // 此处将键改为固定字符串,对应后续$$引用的变量名 {"let",new BsonDocument{ {"Maincode","$Maincode"},{"Renkcode" , "$Renkcode" } } }, {"pipeline", new BsonArray{ new BsonDocument("$match", new BsonDocument("$expr", new BsonDocument("$and", new BsonArray{ new BsonDocument("$eq",new BsonArray { "$Maincode", "$$Maincode" }), new BsonDocument("$eq", new BsonArray { "$Renkcode", "$$Renkcode" }) }))) } }, {"as","statuses"} }); var pipeline1 = new[] { lookup }; var depostatus = czProductcollection.Aggregate<Product>(pipeline1).ToList();
补充说明
如果你的Maincode、ColorCode是C#中定义的、存储字段名的常量,你需要确认它们的常量值是符合Mongo变量命名规则的(不要包含小数点、不要以数字开头),如果不符合可以先做一层映射,比如把带小数点的字段名映射为下划线分隔的合法变量名再使用。
内容的提问来源于stack exchange,提问作者Mustafa Yasin Çelik
相关产品推荐
相关产品推荐

