MongoDB如何编写查询子实体存在缺失项的父级数据的Criteria查询
实现代码
直接在你的原有Criteria列表中添加如下规则即可:
// 构造子实体字段缺失的判断规则 Criteria childMissCondition = new Criteria().orOperator( // 判断price缺失:字段不存在/为null/为空字符串,不需要的条件可自行删除 Criteria.where("price").exists(false), Criteria.where("price").is(null), Criteria.where("price").is(""), // 判断cft缺失 Criteria.where("cft").exists(false), Criteria.where("cft").is(null), Criteria.where("cft").is(""), // 判断itemKpc缺失:字段不存在/为null/为空列表,不需要的条件可自行删除 Criteria.where("itemKpc").exists(false), Criteria.where("itemKpc").is(null), Criteria.where("itemKpc").size(0) ); // 匹配childEntity数组中至少有1个子元素满足上面的缺失规则 criteria.add(Criteria.where("childEntity").elemMatch(childMissCondition)); // 最后把所有规则合并到查询对象中 query.addCriteria(new Criteria().andOperator(criteria.toArray(new Criteria[0])));
逻辑说明
elemMatch是MongoDB专门用于数组匹配的运算符,作用就是筛选出数组中至少存在一个元素满足指定条件的文档,刚好匹配你要的「存在任意子项字段缺失」的需求- 内层
orOperator包裹的是单个子实体的所有字段缺失的判断场景,只要子实体命中其中任意一条就符合要求 - 你可以根据自己的业务规则调整判断条件,比如空字符串不算缺失的话就删掉对应
is("")的条件,空列表不算itemKpc缺失就删掉size(0)的条件
内容的提问来源于stack exchange,提问作者Jeet
相关产品推荐
相关产品推荐

