5

したがって、バケットの下にいくつかのレコード/ドキュメントを作成し、ユーザーが RDBMS の 10 列のうち 1 列のみを更新したとします。そのため、その 1 列のデータのみを送信し、couchbase で更新しようとしています。しかし問題は、couchbase がレコード全体を上書きし、残りの列に NULL を入れていることです。

1 つの方法は、既存のレコードを Cbase からフェッチした後にすべてのデータをコピーし、古い列からデータをコピーしながら新しい列を上書きすることです。しかし、それは最適なアプローチのようには見えません

助言がありますか?

4

3 に答える 3

3

N1QL update 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 に追加できます。

namespace-name:keyspace-name.

use-keys-clause: 更新するデータ項目のキーを指定します。オプション。キーは任意の式にすることができます。

set-clause: 変更する属性の値を指定します。

unset-clause: ドキュメントから指定された属性を削除します。

update-for: update for 句は、FOR ステートメントを使用してネストされた配列を反復処理し、配列内の一致するすべての要素に対して指定された属性を SET または UNSET します。

where-clause: データを更新するために満たす必要がある条件を指定します。オプション。

limit-clause: 更新できるオブジェクトの最大数を指定します。この句には、上限として負でない整数を指定する必要があります。オプション。

return-clause: result_expression で指定されたとおりに更新したデータを返します。

RBAC 権限

UPDATE ステートメントを実行するユーザーは、ターゲット キースペースに対する Query Update 権限を持っている必要があります。SELECT 句や RETURNING 句など、データの読み取りが必要な句がステートメントに含まれている場合は、それぞれの句で参照されるキースペースに対するクエリ選択権限も必要です。ユーザー ロールの詳細については、承認を参照してください。

例えば、

次のステートメントを実行するには、ユーザーは に対するクエリ更新権限を持っている必要がありますtravel-sample

UPDATE `travel-sample` SET foo = 5

次のステートメントを実行するには、ユーザは に対する Query Update 権限と に対するtravel-sampleQuery 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」を「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 ステートメントは、ネストされた配列要素を設定するように改善されました。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;
于 2016-01-23T20:30:33.660 に答える