1

在我的 CouchDB 数据库中,所有键的格式为“A_xxxxxxxx”,其中 xxxxxxxx 是零填充的十进制数(例如“A_00000001”或“A_12345678”)

我只想获取给定键范围内的键数。

例如,要获取从 A_10000000 到 A_30000000 的键,我可以查询如下内容:

GET DATABASE/_all_docs?startkey="A_00001000"&endkey="A_30000000"&include_docs=false

但结果包含所有键,我需要计算输出的“docs”字段中的元素。

由于我的查询中键的数量会很大,我只想知道键的数量,而不是键的实际列表。

范围开始和范围结束值可以变化,这不是固定的。

是否可以只获取给定范围的键数,而不检索实际的键列表?

谢谢,

4

1 回答 1

1

您无法使用内置_all_docs视图获取给定键范围内的键数。但是您可以使用自定义地图缩减视图获得所需的结果,例如CouchDB Definitive Guide中描述的这个视图

地图.js

function(doc) {
    emit(doc._id, 1);
}

减少.js

function(keys, values, rereduce) {
    return sum(values)
}

您可以使用 Futon 管理实用程序通过创建具有以下内容的新文档将这些视图添加到您的 CouchDB 数据库中:

{
   "_id": "_design/test",
   "views": {
       "count": {
           "map": "function(doc) {\n    emit(doc._id, 1);\n}",
           "reduce": "function(keys, values, rereduce) {\n  return sum(values)\n}"
       }
   }
}

_design/test/count然后可以像这样查询而不是_all_docs返回开始键和结束键之间的文档数。

当我再次运行此查询时,我的数据库没有开始和结束键,我得到以下结果:

{
    "rows":[
        {
            "key": null,
            "value": 185
        }
    ]
}

使用填充的开始键和结束键再次运行查询,我得到以下结果:

{
    "rows":[
        {
            "key": null,
            "value": 11
        }
    ]
}
于 2012-11-06T17:33:05.677 回答