使用MarkLogic Optic API查询TDE视图时提示BookingCreateDt列不存在报错
问题根因
报错和TDE模板本身无关,是Optic查询的链式调用顺序写错了:你在查询最开始就用op:select()只保留了Ancillary_QuotePrice、transMode两个列,后续op:where()过滤时引用的BookingCreateDt已经被上一步的select操作排除在可用列范围外,执行时自然会报列不存在的错误。
修复方法
根据你是否需要在最终结果里返回BookingCreateDt,选对应方案即可:
- 不需要返回该列:把
op:select()裁剪返回列的步骤挪到op:where()过滤逻辑之后,先基于全量可用列完成条件筛选,最后再裁掉不需要返回的字段,修正后的完整代码如下:
xquery version "1.0-ml"; import module namespace op=http://marklogic.com/optic at "/MarkLogic/optic.xqy"; op:from-view("GTM2_Shipment", "Shipment_View", "") => op:where( op:and(( op:eq(op:col('transMode'), 'Sea'), op:gt(op:col('BookingCreateDt'), '2022-03-21T15:03:20') )) ) => op:select(("Ancillary_QuotePrice", "transMode")) => op:limit(1) => op:result()
- 需要返回该列:直接把
BookingCreateDt加到现有op:select()的列列表里,把select部分改成op:select(("Ancillary_QuotePrice", "transMode", "BookingCreateDt"))即可。
额外提示
- Optic的链式调用是严格按书写顺序逐阶段执行的,每个阶段的可用列集合完全由上一阶段的输出决定,不要在裁剪列之后再引用被裁掉的列做过滤、计算、聚合操作。
- 建议确认TDE模板中
BookingCreateDt的映射类型为dateTime,如果被映射为字符串类型,直接做时间大小比较可能出现排序逻辑错误,必要时可通过op:xs-dateTime(op:col('BookingCreateDt'))做显式类型转换后再比较。
内容的提问来源于stack exchange,提问作者Rashmita Purkayastha
相关产品推荐
相关产品推荐

