2013-06-12 49 views
0

我有一些字符串,我將隨時間連接到一個基於couchbase的文檔。 我這樣做與clojure,代碼是非常簡單的以json格式在couchbase中存儲csv

;create document when new 
(cbc/add client key value) 

;append when document exists 
(c/async-prepend client key (str "," value) (c/get-cas-id client key) 

而這一切工作正常。我可以大致勾勒出我要討論的問題的步驟如下

  1. 添加值:「1」
  2. 獲取價值:1
  3. 追加值」,2"
  4. 獲取價值:1,2

這工作正常,而且一切都是華麗。但是這個問題並不是真正的預先考慮,而是以一種仍然是有效的json的方式預先考慮了couchbase。因爲1,2不是有效的json,所以couchbase UI會顯示base64編碼值,或者它有時會顯示無效的json(即使從memcache和api返回正確的值)。

From the couchbase forum我瞭解到這是預期的行爲。我真的很想避免這種情況,並以有效的json格式存儲值(並追加它們)。

我可以做類似

{ "vals" : [1,2] } 

,每次追加到vals,但現在,如果我追加3,它會變成是[1,2], 3這又是不是一個有效的JSON。

我不想獲取值,刪除結尾括號,添加新值,結束括號並再次保存,因爲(1)破壞了追加的目的和(2)文檔變得越來越大並且每次讀取所有值以添加新值都是無效的。

最後,我的問題在這裏歸結爲兩點:

1)它是好離開這個數據是 - 我是從API的獲得正確的數據,無論如何,用戶界面不能告訴我數據或顯示base64編碼的數據,所以我不能編輯它..這是唯一的缺點(爲什麼我要從UI編輯數據?)

2)如果有一種解決方法,是有一種方法可以存儲數據,這樣每次都可以使json有效,所以它顯示在UI和API中。 - 現在這個缺點是文件是更大的,有更多的處理需要獲得所需的數據({ "value": [1, 2]}而不是1,2

更不用說我還不知道如何添加更多的值來它!

請指教!

+0

每次寫入文檔時,都會創建文檔的新版本。它不是在磁盤上「追加」,所以對於你的代碼來說,每次都不會產生有效的JSON(如果這是你的最終目標)真的沒有任何好處。 – WiredPrairie

+0

@WiredPrairie - 你可以擴展嗎?即使它正在用新數據重新創建一個新文檔,我仍然沒有在添加之前獲取整個內容,因此事先爲我節省了大量計算空間。 – LocustHorde

+0

這不是CouchDB/Base的工作原理。您需要獲取整個文檔並保存整個文檔。我不確定你的意思是「計算」。您可以在重新保存前以任何方式操縱「JSON」字符串(刪除幾個字符,然後添加新的字符以使其有效)。 – WiredPrairie

回答

1

很確定沒有辦法解決這個問題。與追加和prepend你會打破你的JSON。它的缺點是你將無法使用視圖查詢數據 - 該功能需要有效的json。因此,只要您通過關鍵值檢索數據即可,在couchbase服務器中非json數據沒有問題。

0

我不知道它是否適合你,但你可以嘗試去做這樣的把戲: 在數據庫中存儲一些有效的JSON文檔,其中包含一些指向該csv值的鍵的屬性。例如:

doc: { "doc.id":"some_id", "doc.type":"some_type", "doc.values":"values:for:doc_some_id" }

那麼你/添加您的CSV數據追加到該鍵values:for:doc_some_id,讓您得到:

"key": "values:for:doc_some_id", "value": "1,2,3..."

然後在發射功能,你會得到正確的JSON文檔,然後得到鍵保存值,然後通過該鍵獲取值。有關整理視圖的信息,請參見link。我從來沒有使用過它們,但我認爲要實現您想要嘗試遵循該示例的步驟。