我有一个带有以下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 = ,因为我不知道实时数据库中的下一个键是什么。
在这种情况下,您会推荐哪些解决方案?
答案 0 :(得分:4)
key="couchdb"&group=true
应该有用。
我们在生产中有几个视图和查询完全相同,我只尝试了其中一个。如果得到一个空结果,那么键可能与您发出的完全相同。仔细检查你是否发出一个字符串作为键(你发布的地图函数就是这样做的)以及是否存在任何大小写差异(使用toLowerCase()
来确定 - 在你的例子中这不是必需的)。
在其他情况下(任何以“couchdb”开头的标记),您可以在末尾使用带有高字符的 endkey (“couchdb \ ufff0” ),但这对此没有帮助。