如何创建字段

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)