【问题标题】:Do a CouchDB reduce query for a single key对单个键执行 CouchDB reduce 查询
【发布时间】: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= 因为我这样做不知道实时数据库中的下一个键是什么。

在这种情况下您会推荐什么解决方案?

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    key="couchdb"&group=true 应该可以工作。

    我们在生产环境中有几个视图和查询完全一样,我只是尝试了其中一个。如果您得到一个空结果,则可能密钥与您发出的密钥不完全相同。仔细检查您是否发出单个字符串作为键(您发布的 map 函数正确)以及是否存在任何大小写差异(使用 toLowerCase() 确保 - 在您的示例中这不应该是必需的)。

    在其他情况下(任何以 "couchdb" 开头的标签),您可以使用结尾带有高字符的 endkey ("couchdb\ufff0" ),但这在这里没有帮助。

    【讨论】:

    • 我同意简单的键和组查询应该可以工作。需要注意的一件事可能是正确 urlEncoding 您需要的任何双引号。
    • 感谢您的回答,伯恩哈德。我需要正确地转义键中的空格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2017-01-27
    • 2017-02-11
    相关资源
    最近更新 更多