删除多个文件

时间:2015-06-23 10:20:08

标签: javascript marklogic

以下代码正在运行但速度极慢。直到搜索功能一切顺利。首先,搜索函数返回一个序列而不是一个数组(为什么?!)。其次,数组由节点组成,我需要删除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");
};

3 个答案:

答案 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] )