MongoDB聚合查询中如何仅投影数组内匹配到的元素?
错误原因
genres.$这种位置投影语法是find()查询的专属特性,不支持在聚合框架的$project阶段使用,这就是触发「FieldPath field names may not start with '$'」报错的直接原因。
聚合正确实现方式
使用聚合运算符$filter过滤genres数组,仅保留符合要求的元素即可实现需求,写法如下:
Shows.aggregate([ { $match: { 'genres': 'Action' } }, { $project: { _id: 0, url: 1, name: 1, runtime: 1, genres: { $filter: { input: "$genres", as: "genre", cond: { $eq: ["$$genre", "Action"] } } } } } ]);
补充说明
如果需要和原find查询的$投影行为完全一致,就算数组里存在多个匹配项也仅保留第一个匹配到的元素,且保持数组格式,可以在$filter外层加$slice限制返回长度:
genres: { $slice: [ { $filter: { input: "$genres", as: "genre", cond: { $eq: ["$$genre", "Action"] } } }, 1 // 仅保留第一个匹配元素 ] }
内容的提问来源于stack exchange,提问作者Vinita
相关产品推荐
相关产品推荐

