我试图根据一种模式批量删除文档,但由于集合包含超过500K个文档,forloop似乎挂起了.下面是我的代码:
for (const uri of cts.uris("", null, cts.jsonPropertyValueQuery("source", "survey"))) {
xdmp.documentDelete(uri);
}
有人能帮我找到一个更好的方法来删除MarkLogic中的文档吗?
我试图根据一种模式批量删除文档,但由于集合包含超过500K个文档,forloop似乎挂起了.下面是我的代码:
for (const uri of cts.uris("", null, cts.jsonPropertyValueQuery("source", "survey"))) {
xdmp.documentDelete(uri);
}
有人能帮我找到一个更好的方法来删除MarkLogic中的文档吗?
试图通过"煮沸海洋"类型的查询在单个事务中修改一组非常大的文档,可能会遇到执行时间、事务大小、扩展树缓存等方面的限制.
最好把工作分成更小的单元.
一种简单的方法是将工作生成多个事务,这些事务在任务服务器上执行.在XQuery with xdmp:spawn-function()
中可以很容易地做到这一点(不幸的是,SJS中没有等效的函数):
xquery version "1.0-ml";
for $URI in cts:uris("", (), cts:json-property-value-query("source", "survey"))
return xdmp:spawn-function(function(){ xdmp:document-delete($URI) })
您可以修改上面的代码来删除URI的子集,而不是一次删除一个子集.但是,这些删除事务应该执行得非常快(并且对于任务服务器配置的线程数并行),因此可能不值得花更多的时间编写更复杂的代码.
另一种 Select 是使用批处理工具,例如CoRB