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

Optic API:如何按逗号分隔字符串生成独立行

解决MarkLogic Optic API拆分逗号分隔字段为多行的问题

在MarkLogic 10.0-6.1中,要将Optic API查询结果里逗号分隔的activeIngredient字段拆分为多行(每行对应一个ID),不能直接用op:map(它仅逐行转换数据,不会生成新行),正确的做法是结合fn:tokenize和op:unnest实现行展开:

完整查询示例

假设你从视图获取数据,核心查询代码如下:

op:from-view("your-schema-name", "your-view-name")
// 1. 将逗号分隔的字符串拆分为字符串数组
=> op:bind("temp-ingredient-list", fn:tokenize(op:col("activeIngredient"), ","))
// 2. 把数组的每个元素拆成独立行,同时替换原activeIngredient字段
=> op:unnest(op:col("temp-ingredient-list"), "activeIngredient")
// 3. 选择需要保留的字段,移除临时数组列
=> op:select((
    op:col("productId"),
    op:col("productName"),
    op:col("languageCode"),
    op:col("activeIngredient"),
    op:col("updatedDate")
))
=> op:result()

如果是从文档集合查询,只需将op:from-view替换为op:from-documents或对应的数据源函数即可,核心逻辑不变。

关键步骤说明

  1. op:bind + fn:tokenize:把activeIngredient的逗号分隔字符串转换成字符串数组,存储到临时列temp-ingredient-list中。
  2. op:unnest:将数组中的每个元素拆分为单独的数据行,同时把元素值赋值给activeIngredient字段,自动保留原行的其他字段值。
  3. op:select:过滤掉临时数组列,只保留业务需要的字段。

为什么op:map无法实现?

op:map的作用是对每一行数据做转换处理,最终返回的行数和原数据一致。如果在map里循环数组并赋值,只会不断覆盖activeIngredient的字段值,最终只保留最后一个数组元素,无法生成新行。而op:unnest是专门用于将数组展开为多行的Optic操作符,是处理这类场景的标准方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:03:18