简化 Couchdb JSON 响应
Posted
技术标签:
【中文标题】简化 Couchdb JSON 响应【英文标题】:Simplify Couchdb JSON response 【发布时间】:2011-06-24 09:30:22 【问题描述】:我将位置数据存储在 Couchdb 中,并且正在寻找一种方法来获取仅包含值的数组,而不是每条记录的 key: value。例如:
目前的反应
"total rows": 250, "offset": 0, "rows":[
"id": "ec5de6de2cf7bcac9a2a2a76de5738e4", "key": "user1", "value": "city": "San Francisco", "address":"1001 Bayhill Dr",
"id": "ec5de6de2cf7bcac9a2a2a76de573ae4","key": "user1", "value": "city": "Palo Alto", "address":"583 Waverley St"
... (etc).
]
我只需要:
["city": "San Francisco", "address":"1001 Bayhill Dr",
"city": "Palo Alto", "address":"583 Waverley St",
...]
所有这一切的原因是为了最大限度地减少 JSON 响应消耗的带宽量。 我似乎找不到将视图转换为简单数组的方法。有什么建议吗?
谢谢。
【问题讨论】:
【参考方案1】:您可以使用_show and _list 函数,它们可以获取文档或视图(分别),并且可以以您需要的任何格式发回转换后的响应。 (在本例中为 JSON)
更新:我在我自己的 CouchDB 上使用您在此处提供的数据运行了一个简单的测试。这是我最终编写的列表函数。自定义它以满足您的需求。 :)
function (head, req)
// specify that we're providing a JSON response
provides('json', function()
// create an array for our result set
var results = [];
while (row = getRow())
results.push(
city: row.value.city,
address: row.value.address
);
// make sure to stringify the results :)
send(JSON.stringify(results));
);
【讨论】:
太好了,谢谢!我还没有真正看过 show/list 函数,因为 Couchdb wiki 建议它们的主要目的是直接提供 html(我错了)。顺便说一句,你知道使用这样的节目/列表对性能的影响吗?我也会自己运行一些基准测试。 我手头没有任何号码。它可能会比浏览器端的模板更快(通常)。此外,内置的 ETag 支持是一种很好的缓存机制。 您也可以在 while 循环中发送 JSON。然后在循环之前和之后发送一些东西以使其成为有效的 JSON(并用逗号分隔对象)。基本上,send() 可以根据需要随时调用,而不仅仅是在函数末尾。 我用"function (head, req) provides('json', function() var results = []; while (row = getRow()) results.push(row.value); send(JSON.stringify(results)); );"
做到了。以上是关于简化 Couchdb JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章
关于带有 couchDB 视图的“无效 JSON”的错误,但 json 很好
如何使用 REST/JSON/GET/POST 从我的节点服务器访问我的 couchdb?
Hyperledger Fabric CouchDB as the State Database——使用CouchDB