2013-07-02 25 views
5

因此,假设我在一个存储桶下创建了一些记录/文档,并且用户只更新了RDBMS中的一列(10),所以我尝试只发送一列数据并在couchbase中进行更新。但问题是,couchbase覆盖了整个记录,并为其余列填入NULL。如何将现有数据保存在couchbase中,只更新新数据而不覆盖

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

有什么建议吗?

+0

这是couchbase/CouchDB的是如何工作的。每个文件必须作为一个整体书写。你不能写个别部分。 – WiredPrairie

回答

0

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

0

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

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

+1

有没有实现一个新的更新单个项目功能? – ChickenWing24

3

您可以使用N1QL update stats 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. 

您可以用这种方式添加一个可选的命名空间名称密钥空间名称:

namespace-name:keyspace-name. 

使用密钥子句:指定数据项的锁进行更新。可选的。键可以是任何表达式。

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

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

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

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

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

返回子句:返回按照result_expression中的指定更新的数据。

RBAC特权

用户执行UPDATE语句必须对目标密钥空间查询更新特权。如果语句包含任何需要读取数据的子句,如SELECT子句或RETURNING子句,则对各个子句中引用的密钥空间也需要查询选择特权。有关用户角色的更多详细信息,请参阅授权。

例如,

要执行以下语句,用户必须对travel-sample查询更新特权。

UPDATE `travel-sample` SET foo = 5 

要执行以下语句,用户必须对travel-sample和查询的SELECT权限查询更新权限上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” 到 “以产品为果汁”。

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

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

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

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

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

此语句用教程密钥空间中的键“dave”取消文档的“children”数组中的“gender”属性。

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": "[email protected]", 
       "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; 
相关问题