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

How to delete all fields created in MarkLogic

我有一个要求,即需要删除现有字段。我找到了删除字段范围索引而不是字段的完美脚本。 所以,我写了这个工作正常的脚本,但我需要一个一个地传递每个字段名:

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) 

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

函数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,并以单个保存配置结束。您的代码正在为每个 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!