我们需要在集合中的每个文档的权限中添加几个角色。下面是当前代码(更改为pii)。我们如何将代码更改为处理10,000个记录批?那会减少所需的空间吗?还是有更快的方法来更改文档的权限?
declareUpdate();
let aUri = '';
const uris = cts.uris('',[],cts.collectionQuery('DataCollection'));
for (aUri of uris) {
xdmp.documentSetPermissions(
aUri, [
xdmp.permission("data_user_a", "read"),
xdmp.permission("data_user_b", "read")
]
);
};我们目前正在收到一个错误:
Expanded tree cache full on host marklogic-hostname uri /company/data/document_4534543.json在驱动器上有75次免费演出。
发布于 2022-04-28 12:33:26
尝试在一个事务中处理多个文档会导致扩展的树缓存崩溃,正如您已经发现的那样。
将这些更新分批处理的最简单方法是将工作派生为在任务服务器上执行的单独事务。使用XQuery,您可以在匿名函数中使用xdmp:spawn-function()。
类似这样的东西(我会使用比10k更小的批次):
let $page-size := 1000
let $uris := cts:uris('', (), cts:collection-query('DataCollection'))
let $pages := (count($uris) idiv $page-size) + 1
return
for $page in (1 to $pages)
let $start := (($page - 1) * $page-size) + 1
let $end := $page * $page-size
let $uris := subsequence($uris, $start, $end)
return
xdmp:spawn-function(function(){
for $uri in $uris
return
xdmp:document-set-permissions($uri, (
xdmp:permission("data_user_a", "read"),
xdmp:permission("data_user_b", "read")
)
)
})JavaScript模块没有xdmp.spawnFunction()等价物。不过,您可以调用xdmp.spawn()并执行已安装的模块。
但是,尝试在任务服务器上产生大量的工作也有一些缺点。您只能以一次处理一个事务的任务服务器的速度移动,而且如果您碰巧使用了一个太大的批处理或碰到了一个非常大的文档口袋,您仍然有可能吹掉扩展的Tree。
大批处理作业最好使用批处理工具(如CoRB )运行。它正是为此目的而设计的。您可以调整线程计数和批大小选项,并且可以执行JavaScript模块,而不必将它们安装在模块数据库中。
类似这样的作业的示例属性文件如下所示:
THREAD-COUNT=32
URIS-MODULE=INLINE-JAVASCRIPT|const uris = cts.uris('',[],cts.collectionQuery('DataCollection')); fn.insertBefore(uris, 0, fn.count(uris));
PROCESS-MODULE=INLINE-JAVASCRIPT|declareUpdate(); var URI; xdmp.documentSetPermissions(URI, [xdmp.permission("data_user_a", "read"), xdmp.permission("data_user_b", "read")]);我展示了将代码内联到选项文件中,但您可以告诉它使用文件名和后缀从文件中读取,也可以告诉它模块DB中的模块路径。
然后使用java命令、gradle任务等执行作业。
java -cp "lib/*" -DOPTIONS-FILE=my.properties com.marklogic.developer.corb.Manager xcc://username:password@localhost:8000/database https://stackoverflow.com/questions/72034776
复制相似问题