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

编写N1QL查询关联多文档数组字段,返回含links的完整数据项

解决N1QL查询保留未关联Data.dataValues项并关联文档的问题

你遇到的问题根源是普通UNNEST会过滤掉没有匹配关联项的记录,要保留所有dataValues项,得用LEFT UNNEST配合LEFT JOIN实现左关联,确保原始数据不丢失。以下是符合需求的N1QL查询:

SELECT 
    ARRAY_AGG(
        CASE 
            WHEN links IS NOT NULL THEN OBJECT_MERGE(dv, {"links": links})
            ELSE OBJECT_MERGE(dv, {"links": []})
        END
    ) AS dataValues
FROM 
    `your_bucket_name` AS d
WHERE 
    d.type = 'Data'
LEFT JOIN 
    `your_bucket_name` AS ad ON ad.type = 'AttachedDocuments' AND ad.parentDocId = d.formId
LEFT UNNEST 
    d.dataValues AS dv
LEFT UNNEST 
    ad.documents AS docs ON docs.parentId = dv.questionId
LEFT JOIN 
    `your_bucket_name` AS dm ON dm.type = 'DocumentMetadata' AND dm.id = docs.id
GROUP BY 
    d.id, dv.questionId, dv

关键部分说明:

  • LEFT JOIN 关联AttachedDocuments:左关联保证即使Data没有对应的AttachedDocuments,也不会被过滤。
  • LEFT UNNEST dataValues:替代普通UNNEST,保留所有原始的dataValue项,哪怕没有关联的文档。
  • LEFT UNNEST documents 并匹配questionId:左关联AttachedDocuments里的文档项,仅匹配当前dataValue对应的记录,不影响其他项。
  • LEFT JOIN DocumentMetadata:左关联文档元数据,获取对应的name字段。
  • 分组与构造数组:通过ARRAY_AGG重新组装dataValues数组,用OBJECT_MERGE把收集到的name列表合并到原始dataValue中;没有关联文档时,自动生成空的links数组。

如果不需要无关联项显示links字段,可把CASE语句调整为:

CASE 
    WHEN links IS NOT NULL THEN OBJECT_MERGE(dv, {"links": links})
    ELSE dv
END

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:10:14