couchdb - 如何将现有数据保留在 couchbase 中并且仅更新新数据而不覆盖

标签 couchdb couchbase membase

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

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

有什么建议吗?

最佳答案

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

您可以通过以下方式将可选的命名空间名称添加到键空间名称:

namespace-name:keyspace-name.

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

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

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

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

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”键的文档的“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": "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;

关于couchdb - 如何将现有数据保留在 couchbase 中并且仅更新新数据而不覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416202/

相关文章:

javascript - Membase 有哪些 JavaScript 库

caching - Couchbase 作为缓存和缓存失效

java - spymemcached java客户端故障处理无法正常工作: membase server

Erlang、membase 和 cometd

NHibernate 2nd Level Cache - Membase MemCache - 多 session 工厂

javascript - 在 Nodejs 和 couched/nano 中使用 Promise

ruby - 如何使用 CouchPotato 从 CouchDB 中删除文档?

database - 关于非关系数据库(NoSQL)的问题

angularjs - 哪种数据库和聊天库适合使用 Ionic 框架的基于聊天的应用程序

kubernetes - 用于 Kubernetes (cbopctl) 的 Couchbase Operator 工具不支持 "oidc"身份验证