将变量传递给xdmp.eval()

时间:2015-12-03 19:33:00

标签: javascript eval marklogic

我正在尝试将变量传递到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()}) 

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

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

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

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

1 个答案:

答案 0 :(得分:3)

在大多数要在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 = buz
  • 因此," / foo /" + baz +" .json" = / foo / buz .json