将变量传递给 xdmp.eval()

passing variables to xdmp.eval()

我正在尝试将变量传递到 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 = bar
    2. baz = 嗡嗡声
  • 因此,"/foo/" + baz + ".json" = /foo/buz.json