对单个键执行 CouchDB reduce 查询
Posted
技术标签:
【中文标题】对单个键执行 CouchDB reduce 查询【英文标题】:Do a CouchDB reduce query for a single key 【发布时间】:2012-02-07 08:06:56 【问题描述】:我有一个带有以下文档的 CouchDB:
"name":"Chris",
"tags":["mustache", "music", "couchdb"]
"name":"Noah",
"tags":["hypertext", "philosophy", "couchdb"]
"name":"Jan",
"tags":["drums", "bike", "couchdb"]
地图功能:
function(dude)
if(dude.name && dude.tags)
dude.tags.forEach(function(tag)
emit(tag, 1);
);
减少功能:
function(keys, values)
return sum(values);
现在,如果我使用 ?group=true
参数查询视图,我会返回每个标签的计数:
"rows":[
"key":"bike","value":1,
"key":"couchdb","value":3,
"key":"drums","value":1,
"key":"hypertext","value":1,
"key":"music","value":1,
"key":"mustache","value":1,
"key":"philosophy","value":1
]
我应该使用什么查询来单独获取 "couchdb" 的值?
此示例取自 CouchDB 书籍,而我的实时应用程序有 1000 多个键,大多数时候我只需要找到一个单独键的计数。
我无法使用 key= 参数,这正是我想要的,因为它返回一个空结果。
如果我查询 ?group=true&startkey="couchdb"&endkey="drums"
我只得到 couchdb 的计数,但我不能使用 startkey= 和 endkey= 因为我这样做不知道实时数据库中的下一个键是什么。
在这种情况下您会推荐什么解决方案?
【问题讨论】:
【参考方案1】:key="couchdb"&group=true
应该可以工作。
我们在生产环境中有几个视图和查询完全一样,我只是尝试了其中一个。如果您得到一个空结果,则可能密钥与您发出的密钥不完全相同。仔细检查您是否发出单个字符串作为键(您发布的 map 函数正确)以及是否存在任何大小写差异(使用 toLowerCase()
确保 - 在您的示例中这不应该是必需的)。
在其他情况下(任何以 "couchdb" 开头的标签),您可以使用结尾带有高字符的 endkey ("couchdb\ufff0" ),但这在这里没有帮助。
【讨论】:
我同意简单的键和组查询应该可以工作。需要注意的一件事可能是正确 urlEncoding 您需要的任何双引号。 感谢您的回答,伯恩哈德。我需要正确地转义键中的空格。以上是关于对单个键执行 CouchDB reduce 查询的主要内容,如果未能解决你的问题,请参考以下文章
CouchDB:使用 Reduce 时如何在 Map 函数中使用数组键?
如何按字段对文档进行分组并使用带有 CouchDB 视图的自定义 reduce 函数列出不相等的值
如何编写查询以避免在 select distinct 和 size collect_set hive 查询中使用单个 reducer?