Estoy tratando de eliminar documentos de forma masiva según un patrón pero, dado que la colección contiene más de 500 000 documentos, parece que el forloop se bloquea. A continuación se muestra mi código:
for (const uri of cts.uris("", null, cts.jsonPropertyValueQuery("source", "survey"))) { xdmp.documentDelete(uri); }¿Alguien puede ayudarme con una mejor manera de eliminar documentos en MarkLogic cuando hay un gran volumen?
Es probable que intentar una consulta de tipo "hervir el océano" para modificar un conjunto realmente grande de documentos en una sola transacción se encuentre con límites, ya sea en el tiempo de ejecución, el tamaño de la transacción, la caché de árbol expandida, etc.
Lo mejor es dividir el trabajo en unidades más pequeñas.
Una forma fácil es generar el trabajo en múltiples transacciones que se ejecutan en el servidor de tareas. Puede hacer esto con bastante facilidad en XQuery con xdmp:spawn-function() (desafortunadamente, la función equivalente no está disponible en 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) })Puede modificar el código anterior para eliminar subconjuntos de URI, en lugar de uno a la vez. Sin embargo, esas transacciones de eliminación deberían ejecutarse muy rápidamente (y en paralelo para tantos subprocesos como haya configurado para el servidor de tareas), por lo que puede que no valga la pena la molestia de un código más complicado.
Otra opción es usar una herramienta por lotes, como CoRB