我有一些字符串,随着时间的推移,我将连接到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
这很好用,一切都很花哨。但是这个问题并不是真正的前置,而是以一种仍然是有效的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
)
更何况我还是不知道如何为它添加更多值!
请指教!
答案 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。我从来没有使用它们,但我认为要实现你想要的东西,试着按照那个例子中的步骤。