xquery查找具有特定安全角色的记录

xquery查找具有特定安全角色的记录,xquery,marklogic,Xquery,Marklogic,我试图找到具有特定安全角色的记录,但我似乎找不到一种使用cts:search(应该比for循环更快)的方法。下面是for循环: let $validRoleList := ( xdmp:role("myRole1"), xdmp:role("myRole2") ) for $recordUri in cts:uris((), (), cts:collection-query("bigCollection")) let $documentPermissions := xdmp:do

我试图找到具有特定安全角色的记录,但我似乎找不到一种使用cts:search(应该比for循环更快)的方法。下面是for循环:

let $validRoleList := (
    xdmp:role("myRole1"),
    xdmp:role("myRole2")
)
for $recordUri in cts:uris((), (), cts:collection-query("bigCollection"))
let $documentPermissions := xdmp:document-get-permissions($recorduri)/sec:role-id/fn:string()
let $intPermissions := 
    for $permissionValue in $documentPermissions
    return xs:unsignedLong($documentPermissions)
where $intPermissions eq $validRoleList
return $recordUri

我的“bigCollection”达到了1500万的记录范围,即使在任务服务器上,也要花费一个多小时。有没有更简单的方法可以通过权限角色名来查找记录?

这种循环方法天生就很慢,因为它会将每个文档从磁盘中取出以提取其权限。1500万份文档意味着1500万次磁盘回迁。不管代码是什么,这都很慢

回答这个问题的最快和最简单的方法是使用这两个角色创建并成为用户,并对数据库中的所有URI执行
cts:uris
查询,并且答案将自动有效地限制这两个角色可见的URI


如果您需要它更具动态性,而不需要创建这样的用户,那么管理员用户可以使用角色列表登录。

我在几年前的某个地方找到了这个函数,我不知道它是如何工作的,但它确实可以。我在生产系统中使用它已经多年了,对于您提出的“如何查询具有特定权限的文档?”这一问题,它非常有用。它出现在XQuery中,但我相信每个XQuery函数都有一个JS等价物

declare function permission-query($role, $capability)
{
  cts:term-query(
    xdmp:add64(
      xdmp:mul64(xdmp:add64(xdmp:mul64(xdmp:role($role), 5), xdmp:hash64($capability)), 5),
      xdmp:hash64("permission()")
    )
  )
};