我有两个集合(‘A’和'B'),其中包含数百万份交通保险数据文档。这两个集合有四个共同的元素(客户编号、保险日期、保险编号、事故编号),并且一个元素(许可证编号)只存在于一个集合(‘A’)中。我想提取这两个集合中的所有文档,并且还包含集合‘a’的元素。我可以用cts-search从'A‘检索到所有的客户编号。然后,我遍历这些客户编号中的每一个,以查找'A‘中的许可证编号。它会给出一个空序列。但我知道这是不可能的。有没有人能帮我找到合适的搜索逻辑?
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返回空序列
发布于 2019-07-23 19:54:19
您的第一个cts:search返回整个文档,然后将其作为参数传递给value-query。您可能只想传递abc:Acusno的值。你可以使用像$each//abc:Acusno这样的东西来做到这一点。
但是,您的代码使用的不是非常有效的方法,如果某些Acusno值多次出现,该怎么办?
我建议将范围索引放在abc:Acusno上,并使用cts:values提取与给定查询匹配的唯一值。然后将整个列表作为一个参数提供,而不会循环到针对abc:Bcusno的查询中。您不必在Bcusno上使用范围索引和范围查询,但不管怎样,使用该索引可能会很有用。然后,代码将如下所示:
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)
))
)注意:像这样返回完整的搜索列表时要小心。您可能希望对响应进行分页。
哈!
https://stackoverflow.com/questions/57160421
复制相似问题