编写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
相关产品推荐
相关产品推荐

