我正在处理一个查询,它将过滤节点为空JSON数组的文档,如下所示(Output属性):
{
"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"
]
}发布于 2018-05-18 04:09:12
cts.jsonPropertyValueQuery('Output', '*', 'wildcarded')将匹配在通用索引中转换为空字符串的任何Output属性值。这意味着它匹配:
查找具有(独占)非空值的Output属性的最简单方法是,您可以将上面的内容与对空字符串进行否定搜索相结合:
cts.andQuery([
cts.jsonPropertyValueQuery('Output', '*', 'wildcarded'),
cts.notQuery(
cts.jsonPropertyValueQuery('Output', '')
)
])但请注意,这也将排除具有空字符串数组和非空字符串值的输出属性。若要查找至少具有一个非空字符串的输出属性(因此还应混合使用空值和非空值),应应用范围索引,并使用:
cts.jsonPropertyRange('Output', '!=', '')这将忽略null和空数组。
哈!
https://stackoverflow.com/questions/32517890
复制相似问题