以下代码正在运行但速度极慢。直到搜索功能一切顺利。首先,搜索函数返回一个序列而不是一个数组(为什么?!)。其次,数组由节点组成,我需要删除URI。第三,deleteDocument函数接受一个字符串,而不是URI的数组。
最好的办法是什么?我需要删除年份+旧文档。
这里我使用xdmp.log而不是document.delete只是安全。
var now = new Date();
var yearBack = now.setDate(now.getDate() - 365);
var date = new Date(yearBack);
var b = cts.jsonPropertyRangeQuery("Dtm", "<", date);
var c = cts.search(b, ['unfiltered']).toArray();
for (i=0; i<fn.count(c); i++) {
xdmp.log(fn.documentUri(c[i]), "info");
};
答案 0 :(得分:5)
对cts.uris
执行相同的操作:
var now = new Date();
var yearBack = now.setDate(now.getDate() - 365);
var date = new Date(yearBack);
var b = cts.jsonPropertyRangeQuery("Dtm", "<", date);
var c = cts.uris("", [], b);
while (true) {
var uri = c.next();
if (uri.done == true){
break;
}
xdmp.log(uri.value, "info");
}
HTH!
答案 1 :(得分:3)
使用toArray会起作用,但最有可能的是你的缓慢。 cts.search()函数返回一个迭代器。因此,您所要做的就是遍历它并进行删除,直到其中没有更多项目为止。您也可以将搜索范围限制为1,000个项目。具有大量删除的事务将需要一段时间并且可能会超时。
以下是循环遍历迭代器的示例
var now = new Date();
var yearBack = now.setDate(now.getDate() - 365);
var date = new Date(yearBack);
var b = cts.jsonPropertyRangeQuery("Dtm", "<", date);
var c = cts.search(b, ['unfiltered']);
while (true) {
var doc = c.next();
if (doc.done == true){
break;
}
xdmp.log(fn.documentUri(doc), "info");
}
这是一个例子,如果你想限制在前1000个。
fn.subsequence(cts.search(b, ['unfiltered']), 1, 1000);
答案 2 :(得分:1)
需要考虑几件事。 1)如果您正在搜索删除的目的或任何不需要文档正文的内容,使用返回URI而不是节点的搜索可以快得多。如果这不方便,那么将URI尽可能接近搜索表达式可以获得类似的结果。您希望避免服务器必须获取和扩展文档只是为了获取URI来删除它。
2)尽管JavaScript API涵盖了所有MarkLogic功能,但JavaScript API基于与XQuery API相同的底层功能。了解它是有用的,并查看等效的XQuery API文档以获得全局。例如Arrays vs Iterators - 如果JS搜索API返回了Arrays,那么它可能是一个巨大的性能问题,因为底层代码基于“懒惰评估”。序列例如,搜索可以返回100万行,但如果只查看第一行,服务器通常可以避免访问剩余的999,999,999文档。类似地,当您仅迭代范围时,引用的数据需要可用。如果必须将它们放入阵列中,则必须预先获取所有结果并将其放入内存中。
3)始终记住,返回事物列表的操作可能只受数据库大小的限制。这就是为什么cts.search()和其他功能已经内置了#pacination&#39;。你应该从一开始就为它编码。 通过阅读用户指南,您可以更好地了解如何做某事,但如果数据库变得比内存大,那么如何有效地 - 或者甚至根本无法 - 做到这一点。总的来说,总是编写分页结果的好主意 - 它提高了效率,并且在添加100个文档或100万个文档之后,您的代码仍然可以正常工作。
4)看看xdmp.nodeUrl https://docs.marklogic.com/xdmp.nodeUri, 与fn.documentUri()不同,此函数即使不是文档节点也可以在任何节点上运行。如果您可以将其放在搜索旁边而不是删除旁边,那么系统可以更好地进行优化。 JavaScript指南中的示例是一个良好的开端https://docs.marklogic.com/guide/getting-started/javascript#chapter
在你的情况下,我建议使用这样的方法来试验分页和提取URI,而不必扩展文档..
var uris = []
for (var result of fn.subsequence(cts.search( ... ), 1 , 100 )
uris.push(xdmp.nodeUri(result))
for( i in uris )
xdmp.log( uris[i] )