如何创建字段
How to create Fields
我正在尝试创建一个脚本以使用管理员 API 在 MarkLogic 数据库上添加字段。我创建了以下函数来执行此任务:
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 版本是“7.0-1”。我已经通过脚本成功创建了元素范围索引、属性范围索引。但是为此我遇到了错误。
错误描述说该字段有 include-root。但是,我保留它 false()
admin:database-field("VideoTitle1", fn:false())
我是不是用错了功能或遗漏了什么?
请帮忙。
不是直接的答案,但为什么要重新发明其他人已经发明的轮子。有多种解决方案可以帮助部署数据库设置等。其中之一是 Roxy:
https://github.com/marklogic/roxy
Roxy 提供了一个用于管理 MarkLogic 项目的完整框架。您可以在 github 项目的 wiki 上找到文档和教程。
另一种侵入性较小的解决方案可能是配置一次数据库,然后使用内置的配置管理器 (http://host:8002/nav/) 导出数据库设置,并使用导出将设置导入别处。
HTH!
如果您尝试设置整个数据库,通常最好使用包装 API 和服务:https://developer.marklogic.com/learn/packaging-tutorial gives a tour of the configuration manager web UI, and then there is a guide, an XQuery API, and a REST API.
也就是说让我们尝试调试。很难调试您的错误消息,因为错误消息中的变量名和行号与您的示例代码不匹配。例如,堆栈跟踪具有 $database-id
,但您的代码具有 $dbid
。测试用例需要可重现。
但是我注意到您没有调用正确的函数来构建字段配置。如果你想使用路径,请使用 https://docs.marklogic.com/admin:database-path-field 预先说明,而不是 admin:database-path
。错误消息可能需要一些工作:它应该更像 "Incorrect field: the field VideoTitle1 is not a path field".
如果您真的想为此坚持使用管理员 API,我建议更改您的代码,以便您只调用 admin:save-configuration
一次。面对任何需要重新启动的情况,这会更高效、更稳健。安排这个的一种方法是让您的每个函数调用都采用 $config as element(configuration)
参数和 return 一个新的 element(configuration)
并进行更改。另一种方法是拥有一个模块变量 $CONFIG as element(configuration)
并用 xdmp:set
改变它。查看 以了解这两种技术的示例。
这是您的代码的工作版本:
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)
我正在尝试创建一个脚本以使用管理员 API 在 MarkLogic 数据库上添加字段。我创建了以下函数来执行此任务:
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 版本是“7.0-1”。我已经通过脚本成功创建了元素范围索引、属性范围索引。但是为此我遇到了错误。
错误描述说该字段有 include-root。但是,我保留它 false()
admin:database-field("VideoTitle1", fn:false())
我是不是用错了功能或遗漏了什么?
请帮忙。
不是直接的答案,但为什么要重新发明其他人已经发明的轮子。有多种解决方案可以帮助部署数据库设置等。其中之一是 Roxy:
https://github.com/marklogic/roxy
Roxy 提供了一个用于管理 MarkLogic 项目的完整框架。您可以在 github 项目的 wiki 上找到文档和教程。
另一种侵入性较小的解决方案可能是配置一次数据库,然后使用内置的配置管理器 (http://host:8002/nav/) 导出数据库设置,并使用导出将设置导入别处。
HTH!
如果您尝试设置整个数据库,通常最好使用包装 API 和服务:https://developer.marklogic.com/learn/packaging-tutorial gives a tour of the configuration manager web UI, and then there is a guide, an XQuery API, and a REST API.
也就是说让我们尝试调试。很难调试您的错误消息,因为错误消息中的变量名和行号与您的示例代码不匹配。例如,堆栈跟踪具有 $database-id
,但您的代码具有 $dbid
。测试用例需要可重现。
但是我注意到您没有调用正确的函数来构建字段配置。如果你想使用路径,请使用 https://docs.marklogic.com/admin:database-path-field 预先说明,而不是 admin:database-path
。错误消息可能需要一些工作:它应该更像 "Incorrect field: the field VideoTitle1 is not a path field".
如果您真的想为此坚持使用管理员 API,我建议更改您的代码,以便您只调用 admin:save-configuration
一次。面对任何需要重新启动的情况,这会更高效、更稳健。安排这个的一种方法是让您的每个函数调用都采用 $config as element(configuration)
参数和 return 一个新的 element(configuration)
并进行更改。另一种方法是拥有一个模块变量 $CONFIG as element(configuration)
并用 xdmp:set
改变它。查看 以了解这两种技术的示例。
这是您的代码的工作版本:
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)