JSON属性容器查询对象数组不符合预期,需匹配单个对象多条件
问题描述
现有JSON文档如下:
{ "name": "Bill Gates", "Jobs":[ {"isPrimary": true, "jobTitle":"software engineer"}, {"isPrimary": false, "jobTitle":"senior software engineer"} ] }
执行以下queryBuilder查询语句时,因两个条件分别匹配Jobs数组中的不同对象,当前会返回上述文档,但需求是仅当Jobs数组中存在单个对象同时满足jobTitle等于"senior software engineer"且isPrimary等于true时,才返回该文档:
queryBuilder.containerQuery( queryBuilder.jsonProperty("Jobs"), queryBuilder.and( queryBuilder.value( queryBuilder.jsonProperty("jobTitle"), "senior software engineer"), queryBuilder.value( queryBuilder.jsonProperty("isPrimary"), true)));
解决方案
当前查询的问题在于:containerQuery默认会检查数组中是否存在元素满足jobTitle条件,同时存在元素满足isPrimary条件,而非同一个元素同时满足两个条件。可以通过以下两种方式修改:
方式1:使用ContainerQueryMatcher.ALL参数
如果你的queryBuilder支持containerQuery的第三个参数,指定匹配规则为单个元素满足所有条件:
queryBuilder.containerQuery( queryBuilder.jsonProperty("Jobs"), queryBuilder.and( queryBuilder.value(queryBuilder.jsonProperty("jobTitle"), "senior software engineer"), queryBuilder.value(queryBuilder.jsonProperty("isPrimary"), true) ), ContainerQueryMatcher.ALL );
方式2:使用nested查询
如果API支持nested查询,它会专门针对数组中的单个元素进行条件校验,确保两个条件作用于同一个对象:
queryBuilder.nested( queryBuilder.jsonProperty("Jobs"), queryBuilder.and( queryBuilder.value(queryBuilder.jsonProperty("jobTitle"), "senior software engineer"), queryBuilder.value(queryBuilder.jsonProperty("isPrimary"), true) ) );
修改后,只有当Jobs数组内存在同时符合两个条件的对象时,文档才会被返回,示例中的文档将不再匹配。
内容的提问来源于stack exchange,提问作者Ruby Kannan
相关产品推荐
相关产品推荐

