使用 XQuery 过滤记录 Marklogic
Filter records Marklogic using XQuery
我正在尝试执行查询,但我也在检索我不想检索的记录。
const rslt = cts.uris("", ["limit=500"],
cts.andQuery(
[
cts.jsonPropertyValueQuery("language","java"),
cts.collectionQuery("http://marklogic.com/collections/dls/latest-version"),
])
)
rslt
基于JSON:
{
id: 1,
language: [
"java"
]
},
{
id: 2,
language: [
"java", "C++"
]
}
我想检索只有 java
值的记录,目前正在检索 2 个文档。
我应该使用什么条件来仅获取语言为 java
、记录 1 的文档?
在 MarkLogic 中,每个 JSON 数组值都是其关联的 属性 的值。
给定以下输入:
/stock/1.json
{
"id": 1,
"language": ["java"]
}
/stock/2.json
{
"id": 2,
"language": ["java", "C++"]
}
MarkLogic JavaScript:
const result = [];
const uris = cts.uris('', ['limit=500'],
cts.andQuery([cts.collectionQuery('asset'),
cts.andNotQuery(
cts.jsonPropertyValueQuery('language', 'java'),
cts.jsonPropertyValueQuery('language', 'C++'))
])
);
for (var uri of uris){
result.push({'docId': uri})
}
result
或
const result = [];
const uris = cts.uris('', ['limit=500'],
cts.andQuery([cts.collectionQuery('asset'),
cts.jsonPropertyValueQuery('language', 'java'),
cts.notQuery(cts.jsonPropertyValueQuery('language', 'C++'))
])
);
for (var uri of uris){
result.push({'docId': uri})
}
result
Of course, above JavaScript has its XQuery equivalent.
Other than that, below MarkLogic XQuery would do:
for $doc in fn:collection("asset")
let $lang := $doc/language
where count($lang) = 1 and $lang/data() = "java"
return
<docId>
{xdmp:node-uri($doc)}
</docId>
我正在尝试执行查询,但我也在检索我不想检索的记录。
const rslt = cts.uris("", ["limit=500"],
cts.andQuery(
[
cts.jsonPropertyValueQuery("language","java"),
cts.collectionQuery("http://marklogic.com/collections/dls/latest-version"),
])
)
rslt
基于JSON:
{
id: 1,
language: [
"java"
]
},
{
id: 2,
language: [
"java", "C++"
]
}
我想检索只有 java
值的记录,目前正在检索 2 个文档。
我应该使用什么条件来仅获取语言为 java
、记录 1 的文档?
在 MarkLogic 中,每个 JSON 数组值都是其关联的 属性 的值。
给定以下输入:
/stock/1.json
{
"id": 1,
"language": ["java"]
}
/stock/2.json
{
"id": 2,
"language": ["java", "C++"]
}
MarkLogic JavaScript:
const result = [];
const uris = cts.uris('', ['limit=500'],
cts.andQuery([cts.collectionQuery('asset'),
cts.andNotQuery(
cts.jsonPropertyValueQuery('language', 'java'),
cts.jsonPropertyValueQuery('language', 'C++'))
])
);
for (var uri of uris){
result.push({'docId': uri})
}
result
或
const result = [];
const uris = cts.uris('', ['limit=500'],
cts.andQuery([cts.collectionQuery('asset'),
cts.jsonPropertyValueQuery('language', 'java'),
cts.notQuery(cts.jsonPropertyValueQuery('language', 'C++'))
])
);
for (var uri of uris){
result.push({'docId': uri})
}
result
Of course, above JavaScript has its XQuery equivalent.
Other than that, below MarkLogic XQuery would do:
for $doc in fn:collection("asset")
let $lang := $doc/language
where count($lang) = 1 and $lang/data() = "java"
return
<docId>
{xdmp:node-uri($doc)}
</docId>