MongoDB聚合$match使用动态字段路径匹配文档数组的方法
报错原因
你写的$match阶段逻辑报错核心是混淆了两种$in操作符的语法规则:
- 普通查询语法下的
$in操作符,右侧要求传入固定常量数组,不支持通过$前缀引用当前文档的字段路径。你写的'$wishlist'会被MongoDB识别为普通字符串,而非数组类型的字段值,因此触发"$in needs an array"报错。
正确实现方式
在$match阶段搭配$expr操作符使用**聚合版本的$in**即可,$expr允许在匹配阶段使用聚合表达式,支持字段路径引用。
注意聚合版$in的参数顺序和普通查询版相反:第一个参数传入待查找的值,第二个参数传入要检索的目标数组。
对应聚合阶段代码如下:
{ $match: { $expr: { $in: ['$productId', '$wishlist'] } } }
以上逻辑会逐文档判断:当前文档的productId字段值,是否存在于同文档的wishlist数组字段内,返回true的文档会被匹配保留。
针对你给出的示例文档,productId值为'123',确实在wishlist数组中,会被正常匹配。
注意区分两种$in的用法
- 普通查询
$in:语法为{ 字段名: { $in: [常量值1, 常量值2] } },仅支持匹配字段值是否在预设的常量列表中,不支持字段引用 - 聚合表达式
$in:语法为{ $in: [待检索值表达式, 目标数组表达式] },两个入参都支持字段引用、聚合运算表达式,必须放在$expr、$project、$addFields等支持聚合表达式的场景中使用
内容的提问来源于stack exchange,提问作者abbyabby
相关产品推荐
相关产品推荐

