N1QL在数组内编辑对象

问题描述 投票:1回答:1

我在Couchbase存储桶中包含一些包含对象数组的文档。我正在尝试同时编辑同一文档数组中包含的两个不同对象。

我目前正在运行以下查询来编辑其中一个对象:

UPDATE mydoc SET x.myfield = $1 FOR x IN mydoc.myarray WHEN x.`key` = $2 END;

有没有一种方法可以同时运行这样的几个查询,因为我正在编辑两个不同的子文档?

我看了一下似乎没有提供这种容量的subdoc API,但如果有办法,我很想用它而不是原始的N1QL查询。

我唯一的选择是锁定整个文档,然后在我完成更新后将其解锁?我正在使用GoCB客户端,如果有任何帮助的话。

谢谢 !

database couchbase n1ql
1个回答
0
投票

WHERE子句控制UPDATE的哪个文档和SET子句控制要更新的内容。您需要WHERE子句以避免不必要的突变。

UPDATE mydoc SET x.myfield = $1 FOR x IN mydoc.myarray WHEN x.`key` = $2 END
WHERE ANY v IN mydoc.myarray SATISFIRS v.`key` = $2 AND v.myfield != $1 END;

上面的语句更新了数组中所有匹配的字段。为什么需要同时更新多个语句。没有限制。但请注意更新文档需要获取,修改和写回。在其他一些线程之间修改CAS会不匹配,错误将返回,你需要处理这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.