Marklogic 在数据中心使用文档值进行选择性协调

Marklogic 在数据中心使用文档值进行选择性协调,marklogic,marklogic-dhf,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 re

是否有可能不仅根据集合筛选文档,而且根据特定文档的值有选择地协调文档

目前,以下是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/>

西医
红色
圆圈
小的

您只需修改
收集器.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
中编写了这段代码,但是您的
收集器.xqy
JavaScript
中查找

据我所知,您也可以使用
XQuery
代码,只需根据您的要求进行少量修改。

您需要:


嗨,沙利尼!谢谢你的回复。你有Javascript的代码版本吗?我试图自己转换它,但遇到错误我不太擅长JavaScript。但我认为您可以尝试修改它,如cts:search-->cts.search等。只需修改一些语法就可以了。@Shalini这段代码在功能上是正确的,但效率很低。使用cts:URI比将文档加载到内存中、迭代它们并确定URI要快得多。cts:search的第一个参数中的XPath表达式也是不必要的。@RobS。谢谢你的反馈。我将按照您在我的本地主机中使用cts:uris所说的方式进行测试。@Rob我编写的XQuery看起来正确吗?:)我只是想知道这是否能正常工作。要补充Rob提供的答案:您可以在这里使用所有cts查询,并且您也不必仅使用cts.uri。正如代码上面的注释所述:
@return-一个ID或URI数组
。您还可以使用诸如cts:values而不是cts:uri之类的内容,基于某些范围索引返回唯一的值。
cts.uris(null, null, cts.andQuery([cts.elementValueQuery(xs.QName("ElementId"), "WM"), cts.collectionQuery("LoadCollection"), cts.collectionQuery("SourceCollection"), cts.collectionQuery("Entity1")]));