Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database N1QL编辑数组内的对象_Database_Couchbase_N1ql - Fatal编程技术网

Database N1QL编辑数组内的对象

Database N1QL编辑数组内的对象,database,couchbase,n1ql,Database,Couchbase,N1ql,我在Couchbase bucket中有文档,其中包含一个对象数组。 我试图同时编辑同一文档数组中包含的两个不同对象 我当前正在运行以下查询以编辑其中一个对象: UPDATE mydoc SET x.myfield = $1 FOR x IN mydoc.myarray WHEN x.`key` = $2 END; 在编辑两个不同的子文档时,有没有一种方法可以同时运行几个这样的查询 我看过SubdocAPI,它似乎没有提供这种能力,但如果有办法的话,我希望使用它而不是原始的N1QL查询 我唯一

我在Couchbase bucket中有文档,其中包含一个对象数组。 我试图同时编辑同一文档数组中包含的两个不同对象

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

UPDATE mydoc SET x.myfield = $1 FOR x IN mydoc.myarray WHEN x.`key` = $2 END;
在编辑两个不同的子文档时,有没有一种方法可以同时运行几个这样的查询

我看过SubdocAPI,它似乎没有提供这种能力,但如果有办法的话,我希望使用它而不是原始的N1QL查询

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


谢谢大家!

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将不匹配,错误将返回,您需要处理这种情况。

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将不匹配,错误将返回,您需要处理这种情况。

我最初在上面提到的查询似乎工作得很好,我想问的是如何同时运行其中几个(或者以其他方式进行更新,正如我说的,我可以使用SDK)。我不需要多个查询,但这种情况有时会发生在我的代码中的不同线程上,我需要能够处理。另外,您的意思是,我没有WHERE的查询将更新每个文档,即使它们不匹配?是的。它可以按原样更新同一文档。这就是SQL标准更新的工作方式。一旦您使用WHERE子句无需更新,它将不起作用。您需要自行处理多个更新。N1QL中没有锁。唯一的控制是通过CAS值。谢谢,我不知道这一点,我认为“什么时候”就足够做这个过滤位了。但是,不确定在使用N1QL更新时应如何使用CAS。关于如何在KV sdk中使用它,文档非常简单,但对于使用n1ql时它的工作原理却没有太多的说明。我最初在上面提到的查询似乎工作得很好,我想问的是如何同时运行其中几个(或者以其他方式进行更新,正如我说的,我可以使用sdk)。我不需要多个查询,但这种情况有时会发生在我的代码中的不同线程上,我需要能够处理。另外,您的意思是,我没有WHERE的查询将更新每个文档,即使它们不匹配?是的。它可以按原样更新同一文档。这就是SQL标准更新的工作方式。一旦您使用WHERE子句无需更新,它将不起作用。您需要自行处理多个更新。N1QL中没有锁。唯一的控制是通过CAS值。谢谢,我不知道这一点,我认为“什么时候”就足够做这个过滤位了。但是,不确定在使用N1QL更新时应如何使用CAS。该文档非常简单地介绍了如何将其与KV sdk一起使用,但不太清楚使用n1ql时它是如何工作的。(这里是Couchbase sdk dev)子文档API不支持这样的谓词。要使用KV执行此操作,您需要获取完整文档,进行任何更改,然后将其发回。无需锁定文档,因为您可以使用CAS乐观并发。谢谢您的回答!我最初是做一个N1QL查询,而不是获取/设置完整文档,因为我认为(我可能错了)它比执行一个N1QL查询来检索文档的id(因为我一开始没有),然后根据该id获取整个文档,在数组中循环以找到正确的条目更有效,更新它,然后保存所有内容。有什么提示吗?我不知道KV/N1QL更新在性能方面的比较。另外,如果我决定保留N1QL查询,是否有一种处理并发性的乐观方法,例如使用KV?(这里是Couchbase SDK dev)子文档API不支持这样的谓词。要使用KV执行此操作,您需要获取完整文档,进行任何更改,然后将其发回。无需锁定文档,因为您可以使用CAS乐观并发。谢谢您的回答!我最初是做一个N1QL查询,而不是获取/设置完整文档,因为我认为(我可能错了)它比执行一个N1QL查询来检索文档的id(因为我一开始没有),然后根据该id获取整个文档,在数组中循环以找到正确的条目更有效,更新它,然后保存所有内容。有什么提示吗?我不知道KV/N1QL更新在性能方面的比较。另外,如果我决定保留N1QL查询,是否有一种乐观的方法来处理并发性,比如使用KV?