如何在Couchbase中通过查询更新文档Schema(邮件数组转对象)
用N1QL批量更新Couchbase文档结构
嘿,这个需求完全可以用Couchbase的N1QL查询语句搞定,不用写带循环的程序逐个处理文档~
核心更新语句
直接用UPDATE结合N1QL的数组构造语法就能批量转换数组结构:
UPDATE `your-bucket-name` SET emails = ARRAY { "email": e, "is_active": 1 } FOR e IN emails END WHERE emails IS NOT MISSING AND ARRAY_LENGTH(emails) > 0;
语句解释
ARRAY { "email": e, "is_active": 1 } FOR e IN emails END:这是N1QL专门用来生成新数组的语法,它会遍历原emails数组里的每一个元素e,把每个字符串包装成包含email和is_active字段的对象,最终生成你需要的新数组结构。WHERE子句:用来过滤掉那些没有emails字段或者emails是空数组的文档,避免做无意义的更新操作。
先验证再更新(推荐)
在执行UPDATE之前,你可以先用SELECT语句预览转换后的结果,确保符合预期:
SELECT emails AS original_emails, ARRAY { "email": e, "is_active": 1 } FOR e IN emails END AS updated_emails FROM `your-bucket-name` WHERE emails IS NOT MISSING AND ARRAY_LENGTH(emails) > 0;
额外优化
如果你的桶里有多种类型的文档,只想更新用户类型的文档,可以在WHERE子句里加上类型过滤:
UPDATE `your-bucket-name` SET emails = ARRAY { "email": e, "is_active": 1 } FOR e IN emails END WHERE type = "user" AND emails IS NOT MISSING AND ARRAY_LENGTH(emails) > 0;
内容的提问来源于stack exchange,提问作者Sanchit
相关产品推荐
相关产品推荐

