MarkLogic的Order By中empty greatest和empty least的作用及使用场景是什么?
两个参数的核心定义
- empty greatest:排序时把所有待排序字段为空的文档视为最大值,排序时排在非空值的后面
- empty least:排序时把所有待排序字段为空的文档视为最小值,排序时排在非空值的前面
优先推荐的优化场景(符合MarkLogic默认优化规则)
这类场景可以直接触发排序优化,不需要额外内存计算,查询性能最高,也是MarkLogic不手动指定参数时的默认行为:
- 升序排序场景:比如按内容发布时间从早到晚排序,使用
empty greatest,没填发布时间的内容会自动排在所有有发布时间的内容末尾,符合绝大多数内容列表的展示逻辑。
示例代码:xquery version "1.0-ml"; for $doc in fn:doc() order by $doc/document/publish_date ascending empty greatest return $doc - 降序排序场景:比如按内容更新时间从新到旧排序,使用
empty least,没填更新时间的内容会自动排在所有有更新时间的内容末尾,同样可以触发排序优化。
示例代码:xquery version "1.0-ml"; for $doc in fn:doc() order by $doc/document/update_time descending empty least return $doc
特殊业务场景(需放弃排序优化)
如果业务强制要求空值排在结果最前面,就需要手动指定非优化的配置,这类场景会触发内存排序,仅适合小数据集查询使用:
- 升序排序需要优先展示空值内容:比如做待办清单,按截止日期升序排序,要求未填写截止日期的待办最先展示提醒,就需要用
empty least
示例代码:xquery version "1.0-ml"; for $doc in fn:collection("todo") order by $doc/todo/deadline ascending empty least return $doc - 降序排序需要优先展示空值内容:比如做商品销量排名,按销量降序排序,要求还没有销量数据的新品优先排在最前面引流,就需要用
empty greatest
示例代码:xquery version "1.0-ml"; for $doc in fn:collection("goods") order by $doc/goods/sales_volume descending empty greatest return $doc
内容的提问来源于stack exchange,提问作者marklogic_coder
相关产品推荐
相关产品推荐

