N1QL编辑数组内的对象

时间:2019-03-19 09:36:49

标签: database couchbase n1ql

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

我当前正在运行以下查询来编辑这些对象之一:

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

在编辑两个不同的子文档时,是否可以同时运行多个查询?

我看了一下似乎没有提供此功能的subdoc API,但如果有办法,我很想使用它代替原始的N1QL查询。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

WHERE子句控制要更新的文档,而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将不匹配,错误将返回,您需要处理这种情况。