我有一个视图,它返回标签列表的所有文档。问题是它返回按标签分组的文档。
keys=["tag1","tag2"]
function(doc){
if(doc.tags){
for(var i = 0; i < doc.tags.length; i++){
emit(doc.tags[i], doc);
}
}
}
返回
["rows"]=> array(2) { [0]=> object(stdClass)#6 (2) { ["key"]=> string(4) "tag1" ["value"]=> array(1) { here my list of documents for this tag...
如何将其转换为具有唯一ID的文档列表?
答案 0 :(得分:1)
在视图查询中添加 startkey 和 endkey 参数。
例如,要仅检索带有“tag1”的文档,请使用:
GET ... / _ view / your-view-name?startkey =“tag1”&amp; endkey =“tag1”
你的观点,在幕后,将创建一个“二级索引”(实际上是一个B树)。 这意味着所有“发出”行的列表,按其键排序。这允许非常有效地查找和检索相邻行的子集。
诀窍是创建视图,将您感兴趣的子集放在相邻的行上。
请参阅此处的示例:
Finding many; from CouchDB the definitive guide
阅读此博客,了解如何创建非常智能的索引:CouchDB joins
答案 1 :(得分:0)
如果您要执行“选择唯一doc,其中doc.tags包含'tag1'和'tag2'”的行,您可以考虑使用CouchDB-Lucene。你可以有一个
的索引function(doc) {
if(doc.tags){
var result = new Document();
for(var i = 0; i < doc.tags.length; i++){
result.add(doc.tags[i], {"field":"tag"});
}
return result;
}
}
您可能也想让它使用“关键字”分析器。
然后您可以使用例如
查询它http://localhost:5984/_fti/local/dbname/_design/foo/view_name?q=tag%3Atag1%20AND%20tag%3Atag2
我想不出用“vanilla”CouchDB做的方法,除非你想在客户端上去重复或者有非常大的索引(即每个标记组合被索引),这显然不会很好地扩展你有很多标签。