首页 > 解决方案 > N1QL (CB6.6) ANSI 合并

问题描述

我正在尝试从 ":ao.mos:pro:%" 获取客户 ID 并更新相应的文档 ":pd:pro:%",我们有数千个 ":ao.mos:pro:%" 文档和相应的 ": pd:pro:%" 用于每个 mo:pro 文档。

我正在使用下面的查询,它可以工作,但它只更新一个可以找到索引的文档。

MERGE INTO `bucket1` AS d
USING `bucket1` AS p
ON d.icc = p.icc AND META(d).id LIKE ':pd:pro:%' AND META(p).id LIKE ':ao.mos:pro:%'
WHEN MATCHED THEN
UPDATE SET d.customerId = p.customerId;

有关如何使此功能适用于存储桶中所有匹配文档的任何建议。

标签: couchbasen1ql

解决方案


以下作品。

 CREATE INDEX ix11 ON `default` (icc, customerId) WHERE META().id LIKE ":ao.mos:pro:%";
CREATE INDEX ix12 ON `default` (icc, customerId) WHERE META().id LIKE ":pd:pro:%";
INSERT INTO default VALUES(":ao.mos:pro:1", {"icc":1, "customerId":100});
INSERT INTO default VALUES(":ao.mos:pro:2", {"icc":2, "customerId":101});
INSERT INTO default VALUES(":pd:pro:1", {"icc":1});
INSERT INTO default VALUES(":pd:pro:2", {"icc":1});
INSERT INTO default VALUES(":pd:pro:3", {"icc":2});

MERGE INTO `default` AS m
USING (SELECT p1.icc, p1.customerId
       FROM `default` AS p1
       WHERE META(p1).id LIKE ':ao.mos:pro:%' AND p1.icc IS NOT NULL) AS p
ON m.icc = p.icc AND META(m).id LIKE ':pd:pro:%'
WHEN MATCHED THEN
UPDATE SET m.customerId = p.customerId;

MERGE INTO `default` AS m
USING default AS p
ON m.icc = p.icc AND META(m).id LIKE ':pd:pro:%'  AND META(p).id LIKE ':ao.mos:pro:%'
WHEN MATCHED THEN
UPDATE SET m.customerId = p.customerId;

您是否有以下问题:

第一个源行匹配 2 个目标行。第二个源匹配相同的目标行(通过将 icc 值更改为文档键“:ao.mos:pro:2”的 1)然后在 MERGE 中返回错误(5320 同一文档的多次更新/删除(文档键 'xxx')语句)(与部分更新的行一样,您需要事务不想更新任何内容)因为您不能再次更新同一行。要解决这个问题,您需要更改您的 ON 子句。


推荐阅读