简化Couchdb JSON响应

15
我在Couchdb中存储位置数据,并正在寻找一种方法,可以获取仅包含值的数组,而不是每个记录的键:值。例如:

当前的响应


当前的响应

{"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个回答

19
您可以使用_show和_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的维基建议它们的主要目的是直接提供HTML(我错了)。 顺便问一下,您有使用show/list这样的功能对性能影响的想法吗?我也会自己运行一些基准测试。 - Dick
我手头没有任何数字。通常情况下,这可能比在浏览器端进行模板化更快。此外,内置的ETag支持是一个很好的缓存机制可以利用。 - Dominic Barnes
2
你也可以在 while 循环内发送 JSON。然后在循环之前和之后发送一些内容,以使其成为有效的 JSON(并用逗号分隔对象)。基本上,send() 可以被调用多次,而不仅仅是在函数末尾。 - mikeycgto
我使用 "function (head, req) { provides('json', function() { var results = []; while (row = getRow()) { results.push(row.value); } send(JSON.stringify(results)); });}" 完成了它。 - Yuseferi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接