查询 MarkLogic 合并集合

Querying MarkLogic merged collection

我正在尝试编写查询以从最终合并集合 (sm-Survey-merged) 中获取属性的唯一值。类似于:

select distinct(participantID) from sm-Survey-merged;

我在使用以下等效 JS 查询时遇到树缓存错误。有人可以帮助我进行更好的查询吗?

[...new Set (fn.collection("sm-Survey-merged").toArray().map(doc => doc.root.participantID.valueOf()).sort(),  "unfiltered")]

如果有很多文档,并且您试图在一个查询中读取所有文档,那么您 运行 就有爆掉扩展树缓存的风险。您可以尝试提高该限制,但对于包含大量文档的大型数据库,您仍有可能达到该限制。

生成唯一值列表的最快和最有效的方法是创建一个 range index 和 select 来自该词典的值 cts.values().

如果没有索引,您可以尝试执行迭代查询来搜索和检索一组随机值,​​然后执行其他搜索以排除那些先前看到的值。这仍然 运行 存在炸毁扩展树缓存、超时等的风险。因此,可能并不理想 - 但现在可以让您在不重新索引数据的情况下获得一些信息。

您可以尝试迭代次数和搜索页面大小,看看是否在限制范围内,并提供一致的结果。也许添加一些日志记录或标志以了解您是否已达到迭代限制,但仍会返回更多值以了解它是否是完整列表。您也可以在没有迭代限制的情况下尝试 运行ning,但是 运行 存在出现 OOM 或 ETC 错误的风险。

function distinctParticipantIDs(iterations, values) { 
  const participantIDs = new Set([]); 
  const docs = fn.subsequence(
    cts.search(
      cts.andNotQuery(
        cts.collectionQuery("sm-Survey-merged"), 
        cts.jsonPropertyValueQuery("participantID", Array.from(values))
      ), 
      ("unfiltered","score-random")), 
    1, 1000);

  for (const doc of docs) {
    const participantID = doc.root.participantID.valueOf();
    participantIDs.add(participantID);
  }
  
  const uniqueParticipantIDs = new Set([...values, ...participantIDs]);
  
  if (iterations > 0 && participantIDs.size > 0) {
    //there are still unique values, and we haven't it our iterations limit, so keep searching
    return distinctParticipantIDs(iterations - 1, uniqueParticipantIDs);
  } else {
    return uniqueParticipantIDs;
  }
}

[...distinctParticipantIDs(100, new Set()) ];

另一种选择是 运行 针对数据库的 CoRB 作业,并将 EXPORT-FILE-SORT 选项与 ascending|distinctdescending|distinct 一起应用,以对在一个输出文件。