couchdb减少按键分组

时间:2013-12-24 21:06:44

标签: php couchdb

我有一个视图,它返回标签列表的所有文档。问题是它返回按标签分组的文档。

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的文档列表?

2 个答案:

答案 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做的方法,除非你想在客户端上去重复或者有非常大的索引(即每个标记组合被索引),这显然不会很好地扩展你有很多标签。