深度过滤失效:基于国家筛选Highlight集合的REST API问题
解决Strapi REST API多层关联过滤问题
问题分析
需要从Highlight集合中筛选出满足以下条件的数据:
- 匹配指定
type - 其关联的
highlighted数组中,至少有一个项的campaign关联包含指定国家的countries条目
之前的两种查询存在的问题:
- 第一种查询直接在根
filters中嵌套多层关联过滤,但未处理highlighted和countries的数组属性,Strapi无法正确解析该过滤逻辑,导致过滤失效。 - 第二种查询仅在
campaign的填充阶段添加过滤,既没有从根集合层面筛选符合条件的Highlight,也没有过滤掉无有效campaign的highlighted项,最终返回结果包含无关Highlight以及空campaign数组的highlighted条目。
正确查询写法
const query = { locale: locale.toLowerCase(), filters: { type: { $eq: type }, // 根过滤:仅保留包含符合条件highlighted项的Highlight文档 highlighted: { $elemMatch: { campaign: { countries: { $elemMatch: { name: { $eq: country } } } } } } }, populate: { highlighted: { // 过滤highlighted数组:只保留有符合条件campaign的条目 filters: { campaign: { countries: { $elemMatch: { name: { $eq: country } } } } }, populate: { tag: true, image: true, logo: true, start_at: true, end_at: true, campaign: { // 过滤campaign:仅保留符合国家条件的条目 filters: { countries: { $elemMatch: { name: { $eq: country } } }, name: { $notNull: true } }, populate: { image_small: true, image_large: true, countries: true, campaign_rewards: { populate: ['Boosted'] } } } } } } }; qs.stringify(query, { encodeValuesOnly: true });
关键逻辑说明
- 根层级
$elemMatch过滤:通过highlighted.$elemMatch确保只有包含有效campaign的Highlight文档被返回,从根源上排除不符合条件的数据。 - highlighted层级过滤:在填充
highlighted时添加filters,过滤掉那些没有符合条件campaign的highlighted条目,避免返回空campaign数组的无效项。 - campaign层级过滤:在填充
campaign时再次添加过滤,确保仅返回指定国家的campaign数据,同时按需填充关联字段。
内容的提问来源于stack exchange,提问作者Sufiane
相关产品推荐
相关产品推荐

