MongoDB $lookup操作报错:FieldPath字段名不可以‘$’开头
解决MongoDB $lookup中FieldPath含$开头字段的错误
错误原因
你遇到的FieldPath field names may not start with ‘$’错误,是因为MongoDB不允许localField/foreignField指定的字段路径中包含以$开头的字段名——$是MongoDB内置操作符的前缀,直接用它作为字段名的一部分会被判定为非法字段路径。你的查询里fav_icon.$id中的$id字段就触发了这个限制。
两种可行的解决方法
方法1:使用$lookup的pipeline模式(推荐)
通过let定义变量提取目标字段值,再在内部pipeline中用$expr进行匹配,绕过字段路径的限制:
{ $lookup: { from: 'images', let: { fav_icon_id: '$fav_icon.$id' }, pipeline: [ { $match: { $expr: { $eq: ['$_id', '$$fav_icon_id'] } } } ], as: 'test' } }
let:将fav_icon.$id的值赋值给变量fav_icon_id(变量名不能以$开头)pipeline:在关联集合的查询管道中,用$expr允许的表达式语法,将images集合的_id和变量值做相等匹配
方法2:先提取字段再关联
先通过$addFields阶段把fav_icon.$id的值复制到一个合法命名的字段,再基于这个字段执行$lookup:
[ { $addFields: { temp_fav_icon_id: '$fav_icon.$id' } }, { $lookup: { from: 'images', localField: 'temp_fav_icon_id', foreignField: '_id', as: 'test' } }, // 可选:如果不需要临时字段,可以再加一个$project阶段移除它 { $project: { temp_fav_icon_id: 0 } } ]
内容的提问来源于stack exchange,提问作者Jagan
相关产品推荐
相关产品推荐

