使用Data Hub中的文档值进行选择性协调

时间:2018-08-01 05:22:27

标签: marklogic marklogic-dhf

是否有可能不仅根据集合过滤出文档,还根据特定文档的价值来选择性地协调文档?

当前,以下是我在Data Hub中的收集器插件中的示例代码:

/*
* Collect IDs plugin
*
* @param options - a map containing options. Options are sent from Java
*
* @return - an array of ids or uris
*/
function collect(options) {
// by default we return the URIs in the same collection as the Entity name
return cts.uris(null, null, cts.andQuery([cts.collectionQuery("LoadCollection"),cts.collectionQuery("SourceCollection"), cts.collectionQuery("Entity1")])); 

module.exports = {collect: collect
};

如果要在过滤器中包含来自文档的特定值(按ElementID进行过滤),我应该添加哪些代码修改以仅使特定文档与此元素过滤器保持一致?

以下是Entity1的示例文档:

<envelope xmlns="http://marklogic.com/entity-services">
  <headers/>
  <triples/>
  <instance>
    <Entity1 xmlns="">
      <ElementID>WM</Element1>
      <Color>Red</Color>
      <Shape>Circle</Shape>
      <Size>Small</Size>
      <Location></Location>
   </Entity1>
  <attachments/>

2 个答案:

答案 0 :(得分:2)

您需要cts.elementValueQuery

cts.uris(null, null, cts.andQuery([cts.elementValueQuery(xs.QName("ElementId"), "WM"), cts.collectionQuery("LoadCollection"), cts.collectionQuery("SourceCollection"), cts.collectionQuery("Entity1")]));

答案 1 :(得分:0)

您可以按如下所示简单地修改您的collector.xqy代码-

let $uris := cts:search(doc()/*:envelope/*:instance/*:Entity1,
               cts:and-query((
                 cts:element-value-query(xs:QName("ElementID"),"WM","exact"),      
                 cts:collection-query(("YourCollectionName"))
               )) )
for $i in $uris
    return fn:base-uri($i) 

请注意,我已经在XQuery中编写了此代码,但是您的collector.xqyJavaScript中显示了。

根据我的理解,您可以使用XQuery代码,也可以根据需要进行少量修改。