如何使用N1QL语法移除Couchbase中以'}__modified'结尾的属性
移除Couchbase文档中以
}__modified结尾的属性的N1QL语法 问题描述
我有一个存储简单文档对象的Couchbase bucket,因应用程序bug,桶中被插入了一批名称以}__modified结尾的多余属性。希望通过UNSET操作批量移除所有这类属性,请问正确的N1QL语法是什么?
示例文档数据
[ { "mainstore": { "class_id": "9853ede22ad54d4da86c6d9abc91110a", "class_name": "BLE_34V2", "company": "76092d9bb1b148d18c3484f447a554b4", "connection_type": "gateway", "conns}__modified": 45, "conns5}__modified": 45, "clsd5}__modified": 45 } }, { "mainstore": { "class_id": "6443ede22ad54d4da86c6d9abc91110a", "class_name": "BLE_34V2", "company": "76092d9bb1b148d18c3484f447a554b4", "connection_type": "client", "conns}__modified": 45, "consf5}__modified": 46, "clsd5}__modified": 46 } }, { "mainstore": { "class_id": "1343ede22ad54d4da86c6d9abc91110a", "class_name": "BLE_34V2", "company": "76092d9bb1b148d18c3484f447a554b4", "connection_type": "client", "dfffs}__modified": 45, "dffs5}__modified": 47, "fdss5}__modified": 46 } } ]
解决方案
由于要删除的属性名是动态匹配的,需要结合Couchbase的对象处理函数批量生成要移除的属性列表,再执行UPDATE操作:
最终N1QL更新语句
UPDATE mainstore d UNSET obj.* FOR obj IN [OBJECT_REMOVE(d, v.name) FOR v IN OBJECT_PAIRS(d) WHERE v.name LIKE '%}__modified'] END WHERE ANY v IN OBJECT_PAIRS(d) SATISFIES v.name LIKE '%}__modified' END;
语句解释
OBJECT_PAIRS(d):将文档d转换为键值对数组,遍历所有属性名WHERE v.name LIKE '%}__modified':筛选出所有以}__modified结尾的目标属性OBJECT_REMOVE(d, v.name):逐个移除符合条件的属性,生成清理后的文档结构UNSET obj.*:通过UNSET批量移除这些目标属性- 末尾的
WHERE子句:仅对存在多余属性的文档执行更新,避免无效遍历
预验证查询
执行更新前,可先运行以下查询确认要处理的文档和属性:
SELECT d.class_id, ARRAY v.name FOR v IN OBJECT_PAIRS(d) WHERE v.name LIKE '%}__modified' END AS unwanted_fields FROM mainstore d WHERE ANY v IN OBJECT_PAIRS(d) SATISFIES v.name LIKE '%}__modified' END LIMIT 3;
该查询会返回文档ID及对应的多余属性列表,确认无误后再执行更新操作。
内容的提问来源于stack exchange,提问作者Eliav Gnessin
相关产品推荐
相关产品推荐

