2013-06-12 127 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。我从来没有使用过它们,但我认为要实现您想要尝试遵循该示例的步骤。