CouchDB是否减少了对单个密钥的查询

时间:2012-02-07 08:06:56

标签: couchdb

我有一个带有以下doc的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 个答案:

答案 0 :(得分:4)

key="couchdb"&group=true应该有用。

我们在生产中有几个视图和查询完全相同,我只尝试了其中一个。如果得到一个空结果,那么键可能与您发出的完全相同。仔细检查你是否发出一个字符串作为键(你发布的地图函数就是这样做的)以及是否存在任何大小写差异(使用toLowerCase()来确定 - 在你的例子中这不是必需的)。

在其他情况下(任何以“couchdb”开头的标记),您可以在末尾使用带有高字符的 endkey “couchdb \ ufff0” ),但这对此没有帮助。