Rethinkdb mapreduce not has_fields工作不正常



我试图找到没有电话号码的记录的百分比(按公司分组)。我可以通过以下两个查询来做到这一点:

r.table('users') 
 .merge(lambda u: {'groups': r.table('groups').get_all(r.args(u['group_ids'])).coerce_to('array')}) 
 .filter(lambda u: u.has_fields('phone')) 
 .group(lambda u: u['groups'][0]['company']).count().run()
并获取所有记录的计数:
r.table('users') 
 .merge(lambda u: {'groups': r.table('groups').get_all(r.args(u['group_ids'])).coerce_to('array')}) 
 .group(lambda u: u['groups'][0]['company']).count().run()

然而,我希望使用map-reduce在单个查询中完成此操作,并且可能更高效。这是我的查询,但它不起作用,因为两个数字(电话和计数)是相同的:

r.table('users') 
 .merge(lambda u: {'groups': r.table('groups').get_all(r.args(u['group_ids'])).coerce_to('array')}) 
 .group(lambda u: u['groups'][0]['company']) 
 .map(lambda u: { 'phone': 1 if u.has_fields('phone') else 0, 'count': 1 }) 
 .reduce(lambda a, b: {'phone': a['phone'] + b['phone'], 'count': a['count'] + b['count'] }).run()

所以我的问题是,为什么has_fields()不能在map命令中工作,但在filter命令中工作?

问题是您正在使用Python的if/then/else操作符。Python没有公开与它们交互的方法,因此驱动程序无法看到整个if/then/else语句。如果你用r.branch代替(r.branch(u.has_fields('phone'), 1, 0)),它应该工作。

相关内容

  • 没有找到相关文章

最新更新