将变量传递给xdmp.eval()

passing variables to xdmp.eval()

本文关键字:eval xdmp 变量      更新时间:2023-09-26

我正试图将一个变量传递到MarkLogic 8.0.4 xdmp.eval()中,如下所示:

var spo = 'spo-role';
var spoRoleRes = xdmp.eval("var sec = require('/MarkLogic/security.xqy'); sec.createRole(role)",(role, spo),{"database" : xdmp.securityDatabase()}) 

但我不知道如何将变量传递给我想在安全数据库中运行的脚本。文档似乎反映了XQY文档,请参阅xdmp.eval-docs

在变量下,文档讨论了map:map()对象,它们不是js而是xqy概念。与QName 相同

我尝试了一个序列,一个JSON对象,几个版本的clark表示法,但不知道我应该在这里使用什么名称空间?

问题:如何将变量传递给xdmp.eval()

在xQuery中使用映射的大多数地方,都可以使用javascript中的对象。尽管选项文档在谈论XDMP方面很傻,但实际的API参数定义表明它期望一个对象。

当将对象作为第二个参数传递给xdmp.eval时,它会对此进行扩展,并在计算的代码中为每个对象属性创建局部变量。

我提供了一个简单的概念验证来帮助您了解发生了什么:

var data = {
  "foo": "bar",
  "baz": "buz"
}
xdmp.eval(
  "declareUpdate();   xdmp.documentInsert('/foo/' + baz + '.json', {'a':'aaa'} )",
  data
)

结果是当前数据库中名为/foo/buz.json 的文档

为什么?

  • 因为我传入了一个名为data的对象
  • 这个对象有两个属性(foo和baz)
  • 这些被转化为两个变量
    1. foo=条形
    2. baz=buz
  • 因此,"/foo/"+baz+".json"=/foo/buz.json