以json格式将csv存储在couchbase中

时间:2013-06-12 11:23:27

标签: json csv couchbase

我有一些字符串,随着时间的推移,我将连接到couchbase上的文档。 我正在使用clojure执行此操作,代码非常简单

;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
  5. 这很好用,一切都很花哨。但是这个问题并不是真正的前置,而是以一种仍然是有效的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获取正确的数据,ui无法显示数据或显示base64编码数据,因此我无法对其进行编辑..这是唯一的缺点(为什么我还想从UI编辑数据?)

    2)如果有一种解决方法,有没有办法以每次都使其有效json的方式存储数据,因此它显示在UI和API中。 - 现在的缺点是文档要大得多,并且需要更多的处理来获取所需的数据({ "value": [1, 2]}而不是1,2

    更何况我还是不知道如何为它添加更多值!

    请指教!

2 个答案:

答案 0 :(得分:1)

很确定没有办法解决这个问题。附加和前置你将打破你的json。它的缺点是你将无法使用视图查询数据 - 该功能需要有效的json。因此,只要您可以通过键值检索数据,沙发基站服务器中的非json数据就没有问题。

答案 1 :(得分:0)

我不知道它是否适合你,但你可以尝试做这样的伎俩: 将一些有效的JSON doc存储在数据库中,其中一些属性包含指向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..."

然后在emit函数中你得到正确的json doc,然后获取保存值的键,然后通过该键获取你的值。有关整理视图的信息,请参阅此link。我从来没有使用它们,但我认为要实现你想要的东西,试着按照那个例子中的步骤。