Warm tip: This article is reproduced from serverfault.com, please click

其他-如何删除在MarkLogic中创建的所有字段

(其他 - How to delete all fields created in MarkLogic)

发布于 2020-12-10 13:49:02

我有一个需要删除现有字段的要求。我找到了删除字段范围索引的完美脚本,但没有删除字段。因此,我编写了此脚本,效果很好,但我需要一个一个地传递每个字段名称:

xquery version "1.0-ml";

  import module namespace admin = "http://marklogic.com/xdmp/admin"
          at "/MarkLogic/admin.xqy";

  let $config := admin:get-configuration()
  let $dbid := xdmp:database("testDB")
  let $fields := admin:database-get-fields($config,$dbid)
  for $each in $fields
  let $config := admin:database-delete-field($config, $dbid,$each/*:field-name/fn:string())
  return admin:save-configuration($config) 

还有其他人对此有更好的解决方案吗?这样我们就可以直接传递字段并完成了。

Questioner
Shabana
Viewed
11
grtjn 2020-12-10 23:03:23

函数admin:database-delete-field()接受多个字段名称,因此你可以跳过FLWOR:

xquery version "1.0-ml";

import module namespace admin = "http://marklogic.com/xdmp/admin"
      at "/MarkLogic/admin.xqy";

let $config := admin:get-configuration()
let $dbid := xdmp:database("testDB")
let $fields := admin:database-get-fields($config,$dbid)
let $config := admin:database-delete-field($config, $dbid, $fields/*:field-name)
return admin:save-configuration($config)

就是说,如果发现自己处在无法避免FLWOR的位置,请使用xdmp:set迭代更新$ config,最后完成一个save-config。你的代码正在为每个FLWOR迭代执行该代码。这样的事情也应该起作用:

xquery version "1.0-ml";

import module namespace admin = "http://marklogic.com/xdmp/admin"
      at "/MarkLogic/admin.xqy";

let $config := admin:get-configuration()
let $dbid := xdmp:database("testDB")
let $fields := admin:database-get-fields($config,$dbid)
let $_ :=
    for $each in $fields
    return xdmp:set($config, admin:database-delete-field($config, $dbid, $each/*:field-name))
return admin:save-configuration($config)

HTH!