对单个键执行 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

如何按字段对文档进行分组并使用带有 CouchDB 视图的自定义 reduce 函数列出不相等的值

CouchDB 为行键返回无(减少功能)

couchdb 查询地图视图而不是减少视图

如何编写查询以避免在 select distinct 和 size collect_set hive 查询中使用单个 reducer?