2016-05-16 74 views
1

在掃描文檔時,我無法找到如何更新文檔的一部分。如何更新Couchbase中文檔的部分

- 例如說,整個文檔看起來是這樣的: { 「活動」:真實, 「條形碼」: 「123456789」, 「BrandID」: 「9f3751ef-f14f-464A-bb86-854e99cf14c0」 「BuyCurrencyOverride」:」。37" , 「BuyDiscountAmount」: 「45.00」, 「ID」: 「003565a3-4a0d-47d9-befb-0ac642cb8057」, }

但我只想與部分工作因爲我不想在很多情況下選擇/更新整個文檔:

{ 「活動」:假, 「條形碼」: 「999999999」, 「BrandID」: 「9f3751ef-f14f-464A-bb86-854e99cf14c0」, 「ID」:「003565a3-4a0d-47d9-befb-0ac642cb8057 「, }

如何使用N1QL更新這些字段? Upsert完全替代了整個文檔,更新語句不太清楚。

感謝

+0

什麼更新語句,你試過嗎?應該是像更新x使用密鑰y SET Active = False,條形碼= 9999999,SET ... RETURNING x。* –

+1

所以 - 我對Couchbase很新,看起來我想要做的實際上是一個新的功能在4.5 Beta中,這是我正在使用的功能。我想查看並更新文檔的一部分http://developer.couchbase.com/documentation/server/4.5/developer-guide/sub-doc-api.html。我只是無法將一個對象放入N1QL並使其工作(在內置的查詢編輯器中) –

+0

個人而言,我沒有使用N1QL,但是['UPDATE'](http://developer.couchbase/docs/server/current/n1ql/n1ql-language-reference/update.html)是4.1文檔的一部分 –

回答

4

的回答你的問題取決於爲什麼你只想更新文檔的一部分(例如,你關心的網絡帶寬?),你要如何進行更新(例如, ,從Web控制檯?從使用SDK的程序?)。

您在評論中爲其提供鏈接的4.5子文檔API是僅可通過SDK(例如來自Go或Java程序)的功能,並且該功能的目標是減少網絡帶寬通過不傳送整個文件。您的使用案例是否包含通過SDK進行的程序化文檔修改?如果是這樣,那麼子文檔API是一個好方法。

在N1QL中使用「UPDATE」語句是更改與可以指定「WHERE」子句的模式相匹配的任意數量文檔的好方法。如上所述,它與SQL中的「UPDATE」語句非常類似。要使用你上面的例子,你可以在「活動」字段設置爲false,在任何文件,其中BuyDiscountAmount是「45.00」:

UPDATE my bucket SET Active = false WHERE BuyDiscountAmount = "45.00" 

當運行N1QL UPDATE查詢,幾乎所有的網絡流量將查詢之間,索引和數據節點,因此N1QL更新不會導致進入/離開羣集的網絡流量過多。

如果您提供有關您的用例的更多詳細信息,以及爲什麼只想更新部分文檔,我可以針對正確的方法提供更具體的建議。

+0

好的非常感謝。是的,我將使用.Net SDK(可能適用於.Net?)。我寧願將頁面綁定到整個文檔 - 然後就能夠提交該文檔,而不是爲每個字段編寫更新 - 是節省網絡帶寬。 –

+0

所有SDK的最新版本都應該支持子文檔API,但PHP(即將推出)除外,因此您應該可以在.Net中使用它。 – EbenH

0

它很簡單,像SQL查詢。

update `Employee` set District='SambalPur' where EmpId="1003" 

這裏是性反應的

{

"Employee": { 
     "Country": "India", 
     "District": "SambalPur", 
     "EmpId": "1003", 
     "EmpName": "shyam", 
     "Location": "New-Delhi" 
    } 
    }