首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在xquery marklogic中搜索由公共字段连接的多个集合

在xquery marklogic中搜索由公共字段连接的多个集合
EN

Stack Overflow用户
提问于 2019-07-23 17:00:50
回答 1查看 162关注 0票数 0

我有两个集合(‘A’和'B'),其中包含数百万份交通保险数据文档。这两个集合有四个共同的元素(客户编号、保险日期、保险编号、事故编号),并且一个元素(许可证编号)只存在于一个集合(‘A’)中。我想提取这两个集合中的所有文档,并且还包含集合‘a’的元素。我可以用cts-search从'A‘检索到所有的客户编号。然后,我遍历这些客户编号中的每一个,以查找'A‘中的许可证编号。它会给出一个空序列。但我知道这是不可能的。有没有人能帮我找到合适的搜索逻辑?

代码语言:javascript
复制
    let $col-A :=  cts:search(
   doc(),
    cts:and-query((
         cts:collection-query('col-A'),
        cts:element-value-query(xs:QName('abc:Acusno'), '*', (("wildcarded")))

    )))

  for $each in $col-A
  let $col-B := cts:search(doc(),
      cts:and-query((cts:collection-query('col-B'),
     cts:element-value-query(xs:QName('abc:Bcusno'), $each)
   )))

 return $col-B

返回空序列

EN

回答 1

Stack Overflow用户

发布于 2019-07-23 19:54:19

您的第一个cts:search返回整个文档,然后将其作为参数传递给value-query。您可能只想传递abc:Acusno的值。你可以使用像$each//abc:Acusno这样的东西来做到这一点。

但是,您的代码使用的不是非常有效的方法,如果某些Acusno值多次出现,该怎么办?

我建议将范围索引放在abc:Acusno上,并使用cts:values提取与给定查询匹配的唯一值。然后将整个列表作为一个参数提供,而不会循环到针对abc:Bcusno的查询中。您不必在Bcusno上使用范围索引和范围查询,但不管怎样,使用该索引可能会很有用。然后,代码将如下所示:

代码语言:javascript
复制
let $query :=
  cts:and-query((
    cts:collection-query('col-A'),
    cts:element-query(xs:QName('abc:Acusno'), cts:true-query())
  ))

let $customerNrs :=
  cts:values(
    cts:element-reference(xs:QName("abc:Acusno")),
    (),
    (),
    $query
  )

return cts:search(
  collection(),
  cts:and-query((
    cts:collection-query('col-B'),
    cts:element-range-query(xs:QName('abc:Bcusno'), '=', $customerNrs)
  ))
)

注意:像这样返回完整的搜索列表时要小心。您可能希望对响应进行分页。

哈!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57160421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档