2012-02-07 148 views
2

我有以下DOC一个CouchDB的:做一个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); 
    }); 
    } 
} 

Reduce函数:现在

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和大部分的时间我只需要找到一个单独的密钥的计数。

我不能够使用键=参数,这是我真正想要的东西,因为它返回一个空的结果。

如果我查询?group=true&startkey="couchdb"&endkey="drums"我得到的CouchDB的计数独自一人,但我不能使用startkey =endkey =,因为我不知道接下来的关键是在现场DB什么。

,你会在这种情况下,建议有什么解决办法?

回答

4

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

我们在生产的工作完全一样的若干意见和疑问,我只是试图其中之一。如果你得到一个空的结果,也许这个键与你发出的不一样。仔细检查你是否发出一个单一的字符串作为密钥(你的发布的地图功能就是这样做的),并且如果有任何大写差异(使用toLowerCase()可以肯定 - 在你的例子中不应该这么做)。

在其他情况下(任何标记开始“CouchDB的”),你可以在最后使用endkey高字符(“CouchDB的\ ufff0”),但这并不能帮助这里。

+3

我同意,简单的按键和组查询应该只是工作。有一件事要注意可能是正确的urlEncoding任何你需要的双引号。 – 2012-02-07 15:04:33

+0

感谢您的回答,Bernhard。我需要正确地逃脱关键的空间。 – 2012-02-16 06:41:52