2013-07-02 55 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; 
相關問題