向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 "1.0-ml"; import module namespace t...", (), <options xmlns="xdmp:eval"><database>1754687030342455867</database>...</options>) -- 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
相关产品推荐
相关产品推荐

