繁体   English   中英

使用 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

当然,上面的 JavaScript 有它的 XQuery 等价物。

除此之外,在 MarkLogic XQuery 下面会做:

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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM