我正在使用以下视图函数迭代数据库中的所有项目(以便查找标记),但我认为如果数据集很大,性能非常差。 还有其他方法吗?
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
答案 0 :(得分:7)
免责声明:我没有对此进行测试,也不知道它是否可以表现得更好。
创建单个烫发视图:
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结构会略有不同,但您仍会获得发布日期排序。
答案 1 :(得分:3)
您可以定义一个永久性视图,正如Bahadir建议的那样。但是,在进行此类索引时,不输出每个键的文档。而是发出([tag,doc.published],null)。在当前版本中,您必须为每个文档单独查找,但SVN主干现在支持在查询字符串中指定“include_docs = True”,而CouchDB会自动将文档合并到您的视图中,而不是空间开销。
答案 2 :(得分:1)
你的观点非常正确。一系列的想法:
视图生成是增量的。如果您的阅读流量大于您的写入流量,那么您的观点根本不会引起问题。关注这一点的人通常不应该这样。参考框架,如果您在没有更新的情况下将数百条记录转储到视图中,您应该担心。
发送整个文档会减慢速度。您应该只发出使用视图所需的内容。
不确定val ==“%s”的性能是什么,但你不应该过度思考。如果有标签数组,您应该发出标签。如果你期望一个包含非字符串的标签数组,那么请忽略它。
答案 3 :(得分:0)
# 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秒,不确定大数据集的效率是多少。