我正在尝试使用Admin API创建一个在MarkLogic数据库上添加Fields的脚本。我创建了以下函数来执行此任务:
declare function local:createField($config as element(configuration), $server-config as element(http-server))
{
let $dbid := xdmp:database(fn:data($server-config/database))
let $addField :=
let $fieldspec := admin:database-field("VideoTitle1", fn:false())
return admin:save-configuration(admin:database-add-field($config, $dbid, $fieldspec))
return "SUCCESS"
};
declare function local:createFieldPath($config as element(configuration), $server-config as element(http-server))
{
let $dbid := xdmp:database(fn:data($server-config/database))
let $addPath :=
let $fieldpath := admin:database-field-path("/Video/BasicInfo/Title", 1.0)
return admin:save-configuration(admin:database-add-field-paths($config, $dbid, "VideoTitle1", $fieldpath))
return "SUCCESS"
};
declare function local:createFieldRangeIndex($config as element(configuration), $server-config as element(http-server))
{
let $dbid := xdmp:database(fn:data($server-config/database))
let $addRange :=
let $rangespec := admin:database-range-field-index("string","VideoTitle1", "http://marklogic.com/collation/",fn:false() )
return admin:save-configuration(admin:database-add-range-field-index($config, $dbid, $rangespec))
return "SUCCESS"
};
但我收到错误:
[1.0-ml] ADMIN-BADPATHFIELDTYPE: (err:FOER0000) Incorrect field:
the field VideoTitle1 already has include-root.
In /MarkLogic/admin.xqy on line 5255
In database-check-path-field(<configuration/>, xs:unsignedLong("12095791717198876597"), "VideoTitle1")
$config := <configuration/>
$database-id := xs:unsignedLong("12095791717198876597")
$field-name := "VideoTitle1"
$field := <field xmlns="http://marklogic.com/xdmp/database" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><field-name>VideoTitle1</field-name><include-root>false</include...</field>
$field-path := ()
我正在通过QC运行完整的脚本,而我的MarkLogic版本是&#34; 7.0-1&#34;。我已经通过脚本成功创建了元素范围索引,属性范围索引。但为此我得到了错误。
错误描述表明该字段包含root。但是,我保持虚假()
admin:database-field("VideoTitle1", fn:false())
我使用的是错误的功能还是错过了什么?
请帮忙。
答案 0 :(得分:3)
如果您尝试设置整个数据库,通常最好使用打包API和服务:https://developer.marklogic.com/learn/packaging-tutorial浏览配置管理器Web UI,然后有{{3 },guide和XQuery API。
那说让我们试试调试。调试错误消息很困难,因为错误消息中的变量名称和行号与示例代码不匹配。例如,堆栈跟踪具有$database-id
,但您的代码具有$dbid
。测试用例需要可重现。
但是我注意到你没有调用正确的函数来构造你的字段配置。如果您想使用路径,请使用REST API预先说明 - 而不是admin:database-path
。错误消息可能会使用一些工作:它应该更像“不正确的字段:字段VideoTitle1不是路径字段”。
如果您真的想坚持使用管理员API,我建议您更改代码,以便只拨打admin:save-configuration
一次。面对任何需要重启的问题,这样更有效,更强大。安排此操作的一种方法是为每个函数调用获取$config as element(configuration)
参数并返回带有更改的新element(configuration)
。另一种方法是使用模块变量$CONFIG as element(configuration)
并使用xdmp:set
对其进行变更。请查看https://docs.marklogic.com/admin:database-path-field,了解这两种技术的示例。
这是您的代码的工作版本:
import module namespace admin="http://marklogic.com/xdmp/admin"
at "/MarkLogic/admin.xqy";
declare function local:createField(
$config as element(configuration),
$server-config as element(http-server))
as element(configuration)
{
let $dbid := xdmp:database(fn:data($server-config/database))
let $fieldspec :=
admin:database-path-field(
"VideoTitle1",
admin:database-field-path("/Video/BasicInfo/Title", 1.0))
return admin:database-add-field($config, $dbid, $fieldspec)
};
declare function local:createFieldRangeIndex(
$config as element(configuration),
$server-config as element(http-server))
as element(configuration)
{
let $dbid := xdmp:database(fn:data($server-config/database))
let $rangespec :=
admin:database-range-field-index(
"string",
"VideoTitle1",
"http://marklogic.com/collation/",
fn:false())
return
admin:database-add-range-field-index(
$config, $dbid, $rangespec)
};
let $cfg := admin:get-configuration()
let $fubar := <http-server><database>test</database></http-server>
let $_ := xdmp:set($cfg, local:createField($cfg, $fubar))
let $_ := xdmp:set($cfg, local:createFieldRangeIndex($cfg, $fubar))
return admin:save-configuration($cfg)
答案 1 :(得分:1)
不是直接的答案,而是为什么要重新发明其他已经发明的车轮。有几种解决方案可以帮助部署数据库设置等。其中一个是Roxy:
https://github.com/marklogic/roxy
Roxy提供了管理MarkLogic项目的完整框架。您可以在github项目的维基上找到文档和教程。
另一种较少侵入性的解决方案可能是配置数据库一次,然后使用内置配置管理器(http://host:8002/nav/)导出数据库设置,并使用导出将设置导入其他位置。
HTH!