Couchdb 如何在couchbase中保留现有数据,并且只更新新数据而不覆盖

Couchdb 如何在couchbase中保留现有数据,并且只更新新数据而不覆盖,couchdb,couchbase,membase,Couchdb,Couchbase,Membase,因此,假设我在一个bucket下创建了一些记录/文档,用户只更新RDBMS中10列中的一列,那么我尝试只发送这一列数据,并在couchbase中更新它。但问题是couchbase正在覆盖整个记录,并为其余列设置NULL 一种方法是在从Cbase获取现有记录后,从该记录复制所有数据,然后在从旧记录复制数据的同时覆盖新列。但这看起来并不是一个最佳的方法 有什么建议吗?如果您使用的是结构化(json)数据,则需要读取现有记录,然后更新程序数据结构中所需的字段,然后再次发送该记录。如果不重新发送json

因此,假设我在一个bucket下创建了一些记录/文档,用户只更新RDBMS中10列中的一列,那么我尝试只发送这一列数据,并在couchbase中更新它。但问题是couchbase正在覆盖整个记录,并为其余列设置NULL

一种方法是在从Cbase获取现有记录后,从该记录复制所有数据,然后在从旧记录复制数据的同时覆盖新列。但这看起来并不是一个最佳的方法


有什么建议吗?

如果您使用的是结构化(json)数据,则需要读取现有记录,然后更新程序数据结构中所需的字段,然后再次发送该记录。如果不重新发送json结构中的各个字段,则无法更新这些字段。我不知道有什么方法可以解决这个问题。

确实如此,要更新JSON文档中的单个项目,需要获取整个文档并覆盖它


我们正在努力在不久的将来添加单个项目更新。

您可以使用N1QL更新状态google for Couchbase N1QL 更新用更新的值替换已存在的文档

更新:

UPDATE keyspace-ref [use-keys-clause] [set-clause] [unset-clause] [where-clause] [limit-clause] [returning-clause]
set子句:

SET path = expression [update-for] [ , path = expression [update-for] ]*
UNSET path [update-for] (, path [ update-for ])*  
keyspace-ref: Specifies the keyspace for which to update the document.
更新内容:

FOR variable (IN | WITHIN) path  (, variable (IN | WITHIN) path)* [WHEN condition ] END  
unset条款:

SET path = expression [update-for] [ , path = expression [update-for] ]*
UNSET path [update-for] (, path [ update-for ])*  
keyspace-ref: Specifies the keyspace for which to update the document.
可以通过以下方式向键空间名称添加可选的命名空间名称:

namespace-name:keyspace-name.
use keys子句:指定要更新的数据项的键。可选。键可以是任何表达式

set子句:指定要更改的属性的值

unset子句:从文档中删除指定的属性

update for:update for子句使用for语句迭代嵌套数组,并为数组中的每个匹配元素设置或取消设置给定属性

where子句:指定要更新的数据需要满足的条件。可选

limit子句:指定可以更新的最大对象数。此子句的上限必须为非负整数。可选

returning子句:返回在result_表达式中指定的更新数据

RBAC权限

执行UPDATE语句的用户必须对目标键空间具有查询更新权限。如果语句中有任何需要读取数据的子句,如SELECT子句或RETURNING子句,则在相应子句中引用的键空间上也需要查询选择权限。有关用户角色的更多详细信息,请参阅授权

比如说,

要执行以下语句,用户必须具有
travel sample
上的查询更新权限

UPDATE `travel-sample` SET foo = 5
UPDATE `travel-sample` 
SET foo = 9 
WHERE city = (SELECT raw city FROM `beer-sample` WHERE type = "brewery"
To execute the following statement, user must have the Query Update privilege on `travel-sample` and Query Select privilege on `travel-sample`.

UPDATE `travel-sample` 
SET city = “San Francisco” 
WHERE lower(city) = "sanfrancisco" 
RETURNING *
Example
要执行以下语句,用户必须具有
旅行样本
的查询更新权限和
啤酒样本
的查询选择权限

UPDATE `travel-sample` SET foo = 5
UPDATE `travel-sample` 
SET foo = 9 
WHERE city = (SELECT raw city FROM `beer-sample` WHERE type = "brewery"
To execute the following statement, user must have the Query Update privilege on `travel-sample` and Query Select privilege on `travel-sample`.

UPDATE `travel-sample` 
SET city = “San Francisco” 
WHERE lower(city) = "sanfrancisco" 
RETURNING *
Example
以下语句将产品的“类型”更改为“产品果汁”

此语句从具有“odwalla-juice1”键的文档的“product”键空间中删除“type”属性

此语句为文档的“children”数组中的“gender”属性解除设置,该文档的键为教程键空间中的“dave”

UPDATE tutorial t USE KEYS "dave" UNSET c.gender FOR c IN children END RETURNING t

"results": [
        {
            "t": {
                "age": 46,
                "children": [
                    {
                        "age": 17,
                        "fname": "Aiden"
                    },
                    {
                        "age": 2,
                        "fname": "Bill"
                    }
                ],
                "email": "dave@gmail.com",
                "fname": "Dave",
                "hobbies": [
                    "golf",
                    "surfing"
                ],
                "lname": "Smith",
                "relation": "friend",
                "title": "Mr.",
                "type": "contact"
            }
        }
    ]  
从版本4.5.1开始,UPDATE语句已改进为设置嵌套数组元素。增强了FOR子句以计算函数和表达式,并且新语法支持多个嵌套FOR表达式来访问和更新嵌套数组中的字段。通过链接FOR子句支持其他数组级别

示例

UPDATE default
    SET i.subitems = ( ARRAY OBJECT_ADD(s, 'new', 'new_value' )
        FOR s IN i.subitems END ) 
            FOR s IN ARRAY_FLATTEN(ARRAY i.subitems 
                FOR i IN items END, 1) END;

couchbase/couchdb就是这样工作的。每个文件必须作为一个整体来编写。无法编写单个零件。是否已实施新的“更新单个项目”功能?