【问题标题】:Map and reduce functions in CouchDB-PythonCouchDB-Python 中的映射和归约函数
【发布时间】:2014-10-19 06:23:03
【问题描述】:

如何在 CouchDB-Python 中使用 map 和 reduce 函数,因为下面的代码不返回任何内容?

如果不需要,是否也可以禁用reduce功能?

import couchdb

# $ sudo systemctl start couchdb
# http://localhost:5984/_utils/


def fill_data(users_no):
    for i in range(users_no):
        doc = {
            '_id': str(i),
            'uname': "name_" + str(i),
        }
        db.save(doc)


if __name__ == "__main__":
    server = couchdb.Server()
    db = server.create("test-pagination")
    fill_data(300)



    map_fun = """
                function(doc) {
                    emit(doc.uname, 1);
                }
              """
    reduce_fun ="_count"


    design = { 'views': {
              'get_unames': {
                  'map': map_fun,
                  'reduce': reduce_fun
                }
            } }
    db["_design/users"] = design

    uname_list = db.view('users/get_unames')

    print uname_list
    for r in uname_list :
        print r.key

【问题讨论】:

  • 这只是一个测试,对吧?您知道您不应该在每次查询时都创建视图,不是吗?否则您将失去 Map/Reduce 的效率优势。
  • 你的例子很奇怪......如果你真的想要所有数据,没有自定义排序,也没有分组 .您应该使用查询 _all_docs 而不是您的自定义视图。您甚至可以查询_all_docs?include_docs=true 以获取文档详细信息。如果我可以给你一个建议:你应该学习 CouchDB-Python 之前探索 HTTP API(和常见的 Map/Reduce 算法)。

标签: python python-2.7 mapreduce couchdb couchdb-python


【解决方案1】:

你很少提供关于你想要得到什么的细节。但我从代码中推断出您想要唯一名称。如果是这样,你肯定需要减少数据。

您的问题是您对数据进行了太多分组。您应该使用group_level=exact(或同义词group=true)调用视图。

【讨论】:

    【解决方案2】:

    是的,可以禁用 reduce,这正是您所需要的:

    db.view('users/get_unames', reduce=False)
    

    激活 reduce 后,您将得到准确的一行,只有一个值(300,您的行数)和一个空键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 2015-09-04
      • 2014-12-29
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      相关资源
      最近更新 更多