4

我正在处理一个查询,该查询将过滤具有像这样的空 JSON 数组节点的文档(输出属性):

{
    "Id": "0aec6b50-03ff-48c9-ac35-1b5e7640a892", 
    "Input": "00000000-0000-0000-0000-000000000000", 
    "Output": [
    ]
}

现在我正在使用这个查询:

cts.orQuery([
        cts.notQuery(cts.jsonPropertyValueQuery('Input','00000000-0000-0000-0000-000000000000')), 
            cts.jsonPropertyValueQuery('Output', '*', 'wildcarded')
    ])

它正在过滤所有带有空(空 GUID)Input字段的文档,并且应该(但不是)过滤带有空(空数组)的文档Output

它正在处理文档:

{
    "Id": "0aec6b50-03ff-48c9-ac35-1b5e7640a892", 
    "Input": "00000000-0000-0000-0000-000000000000", 
    "Output": ""
}

我认为这是因为空数组是 MarkLogic 的一个值。有没有人有类似的问题?如何查询空 JSON 数组?

编辑:

非空消息(应该返回)如下所示:

{
    "Id": "0aec6b50-03ff-48c9-ac35-1b5e7640a892", 
    "Input": "00000000-0000-0000-0000-000000000000", 
    "Output": [
        "91ad81fe-9c82-4090-b6a9-a918f901de46"
    ]
}
4

1 回答 1

2

cts.jsonPropertyValueQuery('Output', '*', 'wildcarded')将匹配任何Output将转换为通用索引中的空字符串的属性值。这意味着它匹配:

  • 输出: ””
  • 输出: []
  • 输出: [””]
  • 和输出:空

Output查找具有(仅)非空值的属性的最简单方法,您可以将上述内容与对空字符串的否定搜索相结合:

cts.andQuery([
  cts.jsonPropertyValueQuery('Output', '*', 'wildcarded'),
  cts.notQuery(
    cts.jsonPropertyValueQuery('Output', '')
  )
])

请注意,这也将排除具有空字符串和非空字符串值数组的输出属性。要查找具有至少一个非空字符串(空值和非空值的混合)的输出属性,您应该应用范围索引,并使用:

cts.jsonPropertyRange('Output', '!=', '')

这将忽略 null 和空数组。

HTH!

于 2018-05-17T20:09:11.930 回答