You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向MarkLogic时态集合插入时态文档触发XDMP-NOFIELD错误

MarkLogic时态文档插入报错:XDMP-NOFIELD: systemStart字段未定义

问题场景

执行XQuery语句向MarkLogic数据库的时态集合插入时态文档时触发错误。已在数据库模式中创建元素范围索引,并基于这些轴创建了时态集合。

执行的XQuery代码

xquery version "1.0-ml";
import module namespace temporal = "http://marklogic.com/xdmp/temporal"
      at "/MarkLogic/temporal.xqy";
let $root :=
<tempdoc>
   <trader>John</trader> 
    <content>12</content>  
</tempdoc>
let $options :=  
<options xmlns="xdmp:document-insert">
    <metadata>
       <map:map xmlns:map="http://marklogic.com/xdmp/map">
        <map:entry key="systemStart">
           <map:value>2014-04-03T11:00:00</map:value>
         </map:entry>
         <map:entry key="systemEnd">
           <map:value>9999-12-31T11:59:59Z</map:value>
         </map:entry>
         <map:entry key="validStart">
           <map:value>2014-04-03T11:00:00</map:value>
         </map:entry>
         <map:entry key="validEnd">
           <map:value>9999-12-31T11:59:59Z</map:value>
         </map:entry>
       </map:map>
    </metadata> 
</options> 
return temporal:document-insert("temporalCollection", "koolorder.xml", $root, $options)

报错信息

[1.0-ml] XDMP-NOFIELD: xdmp:eval("xquery version &quot;1.0-ml&quot;;&#10;import module namespace t...", (), &lt;options xmlns="xdmp:eval"&gt;&lt;database&gt;1754687030342455867&lt;/database&gt;...&lt;/options&gt;) -- Field not defined: systemStart

解决方案

错误根源是时态字段的传递方式不符合MarkLogic要求,或者时态集合配置与代码中的字段名不匹配。

步骤1:检查时态集合配置

  • 确认创建时态集合时指定的systemStart、systemEnd、validStart、validEnd字段名与代码完全一致(MarkLogic对字段名大小写敏感)。
  • 确保这些字段对应的元素范围索引已创建,且数据类型为dateTime。

步骤2:修正代码中的时态字段传递方式

MarkLogic提供了两种正确的时态文档插入方式:

方式一:直接传入时态轴参数

xquery version "1.0-ml";
import module namespace temporal = "http://marklogic.com/xdmp/temporal"
      at "/MarkLogic/temporal.xqy";

let $root :=
<tempdoc>
   <trader>John</trader> 
    <content>12</content>  
</tempdoc>

let $system-start := xs:dateTime("2014-04-03T11:00:00")
let $system-end := xs:dateTime("9999-12-31T11:59:59Z")
let $valid-start := xs:dateTime("2014-04-03T11:00:00")
let $valid-end := xs:dateTime("9999-12-31T11:59:59Z")

return temporal:document-insert(
  "temporalCollection", 
  "koolorder.xml", 
  $root, 
  (), 
  $system-start, 
  $system-end, 
  $valid-start, 
  $valid-end
)

方式二:使用temporal:make-document-metadata构造元数据

xquery version "1.0-ml";
import module namespace temporal = "http://marklogic.com/xdmp/temporal"
      at "/MarkLogic/temporal.xqy";

let $root :=
<tempdoc>
   <trader>John</trader> 
    <content>12</content>  
</tempdoc>

let $metadata := temporal:make-document-metadata(
  xs:dateTime("2014-04-03T11:00:00"),
  xs:dateTime("9999-12-31T11:59:59Z"),
  xs:dateTime("2014-04-03T11:00:00"),
  xs:dateTime("9999-12-31T11:59:59Z")
)

return temporal:document-insert(
  "temporalCollection", 
  "koolorder.xml", 
  $root, 
  <options xmlns="xdmp:document-insert">
    <metadata>{$metadata}</metadata>
  </options>
)

关键说明

  • 禁止手动构造map:map类型的元数据传递时态字段,必须使用MarkLogic提供的temporal:make-document-metadata函数生成标准结构。
  • temporal:document-insert函数支持直接传入时态轴参数,这种方式更简洁不易出错。

内容的提问来源于stack exchange,提问作者Rashmita Purkayastha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:50:36