2015-12-03 4 views
2

Я пытаюсь передать переменную в MarkLogic 8.0.4 xdmp.eval() так:Передача переменных в 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()?

ответ

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

Почему ?

  • Потому что я передал объект, называемый данными.
  • Этот объект имеет два свойства (Foo и БАЗ)
  • Они были превращены в две переменные
    1. Foo = бар
    2. Баз = Буз
  • Таким образом, "/ Foo /" + Баз + ".json" =/Foo/Буз .json
+0

Thx Д жадный, большой. На самом деле путают необходимость встраивать параметр, который вы хотите передать внутри произвольного объекта данных {} ... –

+0

Ну, это то же самое, что и переход на карту. Но на самом деле, это еще лучше, чем последовательность сбалансированных пар QNames и значений, а затем объявление внешней переменной. TBH, я делаю это так: var data = {"external": { "foo": "bar", "baz": "buz" }} Затем все мои внешние переменные находятся под singe var называется «external», и я использую dot-notation как: external.foo –

+0

@ hugo-koopmans: Я согласен, что документы второго param могут быть улучшены, я сделаю внутреннюю заметку об этом. – grtjn

Смежные вопросы