查询 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|distinct
或 descending|distinct
一起应用,以对在一个输出文件。
我正在尝试编写查询以从最终合并集合 (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|distinct
或 descending|distinct
一起应用,以对在一个输出文件。