如何在couchbase中保留现有数据,仅更新新数据而不覆盖

时间:2013-07-02 01:45:43

标签: couchdb couchbase membase

所以,假设我在一个存储桶下创建了一些记录/文档,并且用户只更新了RDBMS中的一列中的一列,所以我试图只发送那一列数据并在couchbase中更新它。但问题是,couchbase会覆盖整个记录并为其余列添加NULL。

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

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

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

更新

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

组子句:

SET path = expression [update-for] [ , path = expression [update-for] ]*

更新为:

FOR variable (IN | WITHIN) path  (, variable (IN | WITHIN) path)* [WHEN condition ] END  

未设置子句:

UNSET path [update-for] (, path [ update-for ])*  
keyspace-ref: Specifies the keyspace for which to update the document.

您可以通过以下方式向keyspace-name添加可选的namespace-name:

namespace-name:keyspace-name.

use-keys-clause:指定要更新的数据项的键。可选的。键可以是任何表达。

set-clause:指定要更改的属性的值。

unset-clause:从文档中删除指定的属性。

update-for:update for子句使用FOR语句迭代嵌套数组,并使用SET或UNSET给定数组中每个匹配元素的给定属性。

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

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

returning-clause:返回您在result_expression中指定的更新数据。

RBAC权限

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

例如,

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

UPDATE `travel-sample` SET foo = 5

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

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-juice"。

UPDATE product USE KEYS "odwalla-juice1" SET type = "product-juice" RETURNING product.type

"results": [
        {
            "type": "product-juice"
        }
    ]

此语句删除"类型"属性来自"产品"使用" odwalla-juice1"文档的键空间键。

UPDATE product USE KEYS "odwalla-juice1" UNSET type RETURNING product.*

"results": [
        {
            "productId": "odwalla-juice1",
            "unitPrice": 5.4
        }
    ]

此声明取消了"性别"属于"孩子"带键的文档数组," 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语句已经改进为SET嵌套数组元素。 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;

答案 1 :(得分:0)

如果您正在使用结构化(json)数据,则需要读取现有记录,然后在程序的数据结构中更新所需的字段,然后再次发送记录。您无法更新json结构中的各个字段,而无需再次发送它们。我没有办法解决这个问题。

答案 2 :(得分:0)

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

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