如何用MarkLogic Java API编写否定查询筛选无status字段的JSON文档
解决方案:查找不存在
status字段的JSON文档 你的核心问题是用Java API实现XQuery中cts:not-query(cts:json-property-scope-query("status", cts:true-query()))的逻辑——即匹配完全没有status字段的JSON文档,而你之前的写法只排除了status等于某个特定值的文档,无法覆盖所有存在status字段的情况。
错误原因
你之前的代码:
var notContains = queryBuilder.not( queryBuilder.word(queryBuilder.jsonProperty("status"), "EDITING") );
仅排除了status为EDITING的文档,但数据库中还有status为CORRECTING或ACCEPTING的文档,这些文档依然会被返回,所以你看到的结果是所有文档。
正确实现
在MarkLogic Java API 6.1.0中,要匹配不存在指定JSON属性的文档,直接使用jsonPropertyExists结合not即可,这和你XQuery代码的逻辑完全等价:
StructuredQueryBuilder queryBuilder = new StructuredQueryBuilder(); // 构建查询:匹配不存在status字段的文档 StructuredQueryDefinition query = queryBuilder.not( queryBuilder.jsonPropertyExists("status") ); // 执行查询示例 QueryManager queryManager = client.newQueryManager(); SearchHandle resultsHandle = queryManager.search(query, new SearchHandle());
等价性说明
你在XQuery中使用的cts:json-property-scope-query("status", cts:true-query()),本质是匹配所有存在status字段的文档,和cts:json-property-exists-query("status")效果一致。因此Java API中用not(jsonPropertyExists("status"))就能实现相同的筛选逻辑。
内容的提问来源于stack exchange,提问作者me_how
相关产品推荐
相关产品推荐

