0

我有一些字符串,我将随着时间的推移将它们连接到 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

这很好用,一切都很花哨。但是这个问题实际上并不是关于前置,而是以它仍然是有效 json 的方式前置到 couchbase。因为,1,2不是一个有效的 json,couchbase UI 要么显示一个 base64 编码的值,要么它有时会显示无效的 json(即使从 memcache 和 api 返回了正确的值)。

从 couchbase 论坛我了解到这是预期的行为。我真的很想避免这种情况,并以有效的 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

更不用说我仍然不知道如何为其添加更多价值!

请指教!

4

2 回答 2

1

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

于 2013-06-12T14:21:47.073 回答
0

我不知道它是否对你有用,但你可以尝试这样做:在数据库中存储一些有效的 JSON 文档,其中包含一些属性,该属性包含指向该 csv 值的键。例子:

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

然后你将你的 csv 数据附加/添加到那个 key values:for:doc_some_id,所以你得到:

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

然后在发出函数中,您得到正确的 json 文档,然后获取保存值的键,然后通过该键获取您的值。有关整理视图的信息,请参阅此链接。我从未使用过它们,但我认为要实现您想要的内容,请尝试按照该示例中的步骤进行操作。

于 2013-06-12T14:56:00.470 回答