2014-10-19 165 views
0

在CouchDB-Python中如何使用map和reduce函数是可能的,因为下面的代码不会返回任何东西?在CouchDB-Python中映射和减少函数

如果不需要,还可以禁用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 
+1

这只是一个测试,对吧?你知道你不应该在每次查询时创建视图,是不是?否则你将失去Map/Reduce的效率优势。 – 2014-10-20 05:35:31

+1

你的例子很奇怪......如果你真的想*所有的数据*,没有*自定义排序*,也没有*分组*。您应该使用查询'_all_docs'而不是您的自定义视图。您甚至可以查询'_all_docs?include_docs = true'来获取文档详细信息。如果我可能给你一个建议:你应该在学习CouchDB-Python之前探索HTTP API(以及普通的Map/Reduce算法)*。 – 2014-10-20 06:17:50

回答

0

是的,它可以禁用减少,而这正是你所需要的:

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

随着降低主动,你只有一行回来了,只是一个值(300,你的行数)和空键。

1

对于你想得到的东西,你只提供很少的细节。但我从代码推断,你想要独特的名字。如果是这样,你肯定需要减少数据。

你的问题是你的数据太多。您应该使用group_level=exact(或group=true这是一个同义词)来调用视图。