Strapi嵌套数组$not类过滤失效,求正确过滤方案
Strapi嵌套数组排除指定值的过滤方案
问题背景
现有一组多语言内容数据,结构如下:
[ { id: 1, locale: 'en', localizations: [ { id: 2, locale: 'de' }, { id: 3, locale: 'sv'} ] }, { id: 2, locale: 'de', localizations: [ { id: 1, locale: 'en' }, { id: 3, locale: 'sv'} ] }, { id: 3, locale: 'sv', localizations: [ { id: 1, locale: 'en' }, { id: 2, locale: 'de'} ] } ]
需要筛选出localizations数组中**完全不包含locale: 'en'**的记录,但使用$ne过滤时失效:
filter: { localizations: { locale: { $ne: 'en' } } }
返回全部3条记录,原因是$ne只要匹配到数组中任意一个非'en'的元素,就会保留整条记录,无法实现“数组中无指定值”的过滤逻辑。
解决方法
方法1:使用$not + $elemMatch
通过$elemMatch匹配存在目标值的记录,再用$not取反,过滤出完全不包含目标值的记录:
filter: { localizations: { $not: { $elemMatch: { locale: 'en' } } } }
此写法会排除所有localizations中存在locale: 'en'的主记录,最终仅返回id=1的条目。
方法2:使用$nin(兼容性更佳)
针对部分Strapi版本,也可以直接通过嵌套字段路径配合$nin实现需求:
filter: { 'localizations.locale': { $nin: ['en'] } }
$nin会检查数组中是否不存在指定值,符合需求的记录才会被返回。
内容的提问来源于stack exchange,提问作者IgorCh
相关产品推荐
相关产品推荐

