我正在使用以下视图函数迭代数据库中的所有项目(以便查找标记),但我认为如果数据集很大,性能非常差。 还有其他方法吗?

def by_tag(tag):
return  '''
        function(doc) {
            if (doc.tags.length > 0) {
                for (var tag in doc.tags) {
                    if (doc.tags[tag] == "%s") {
                        emit(doc.published, doc)
                    }
                }
            }
        };
        ''' % tag
有帮助吗?

解决方案

免责声明:我没有对此进行测试,也不知道它是否可以表现得更好。

创建单个烫发视图:

function(doc) {
  for (var tag in doc.tags) {
    emit([tag, doc.published], doc)
  }
};

并查询 _view / your_view / all?startkey = ['your_tag_here']& endkey = ['your_tag_here',{}]

结果JSON结构会略有不同,但您仍会获得发布日期排序。

其他提示

您可以定义一个永久性视图,正如Bahadir建议的那样。但是,在进行此类索引时,输出每个键的文档。而是发出([tag,doc.published],null)。在当前版本中,您必须为每个文档单独查找,但SVN主干现在支持指定“include_docs = True”。在查询字符串中,CouchDB会自动将文档合并到您的视图中,而不会产生空间开销。

你的观点非常正确。一系列的想法:

视图生成是增量的。如果您的阅读流量大于您的写入流量,那么您的观点根本不会引起问题。关注这一点的人通常不应该这样。参考框架,如果您在没有更新的情况下将数百条记录转储到视图中,您应该担心。

发送整个文档会减慢速度。您应该只发出使用视图所需的内容。

不确定val =="%s"表现会是,但你不应该过度思考。如果有标签数组,您应该发出标签。如果你期望一个包含非字符串的标签数组,那么请忽略它。

# Works on CouchDB 0.8.0
from couchdb import Server # http://code.google.com/p/couchdb-python/

byTag = """
function(doc) {
if (doc.type == 'post' && doc.tags) {
    doc.tags.forEach(function(tag) {
        emit(tag, doc);
    });
}
}
"""

def findPostsByTag(self, tag):
    server = Server("http://localhost:1234")
    db = server['my_table']
    return [row for row in db.query(byTag, key = tag)]

byTag map函数返回带有“key”中每个唯一标记的数据,然后是 value 中带有该标记的每个帖子,所以当你抓住key =" mytag"时,它会检索标记为“mytag”的所有帖子。

我已经针对大约10个条目对其进行了测试,并且每个查询似乎需要大约0.0025秒,不确定大数据集的效率是多少。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top