如何更新Couchbase中嵌套结构记录的营业时间字段?
解决Couchbase嵌套数组字段更新问题
适用的N1QL更新语句
针对你的数据结构和需求,可以使用Couchbase的N1QL语句批量更新目标字段:
UPDATE `your-bucket-name` SET `shops`.`1`.`workingHours` = ARRAY CASE WHEN hour.interval.open = 9 AND hour.interval.closed = 15 THEN OBJECT_PUT(OBJECT_PUT(hour, "interval", {"open": 12, "closed": 20}), "info", hour.info) WHEN hour.interval.open = 8 AND hour.interval.closed = 18 THEN OBJECT_PUT(OBJECT_PUT(hour, "interval", {"open": 10, "closed": 16}), "info", hour.info) ELSE hour END FOR hour IN `shops`.`1`.`workingHours` END WHERE `shops`.`1`.`workingHours` IS NOT MISSING;
语句说明
- 将
your-bucket-name替换成你实际使用的Couchbase桶名称 ARRAY ... FOR hour IN ... END:遍历workingHours数组的每个元素,逐个判断并处理CASE分支:根据原营业时间的open和closed值匹配对应规则,替换interval字段,同时保留原info内容WHERE条件:仅更新存在shops.1.workingHours的文档,避免无意义操作
如果需要匹配所有shop ID(不止shops.1),可以用通用写法遍历shops对象的所有键:
UPDATE `your-bucket-name` SET `shops` = OBJECT KEY k: OBJECT_PUT(v, "workingHours", ARRAY CASE WHEN hour.interval.open = 9 AND hour.interval.closed = 15 THEN OBJECT_PUT(OBJECT_PUT(hour, "interval", {"open": 12, "closed": 20}), "info", hour.info) WHEN hour.interval.open = 8 AND hour.interval.closed = 18 THEN OBJECT_PUT(OBJECT_PUT(hour, "interval", {"open": 10, "closed": 16}), "info", hour.info) ELSE hour END FOR hour IN v.workingHours END) FOR k, v IN `shops` END WHERE ANY k IN OBJECT_NAMES(`shops`) SATISFIES `shops`[k].workingHours IS NOT MISSING END;
内容的提问来源于stack exchange,提问作者Emanuel
相关产品推荐
相关产品推荐

