0

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

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

4

1 回答 1

1

The problem is that you're using Python's if/then/else operators. Python doesn't expose a way to interact with these, so the driver can't see the whole if/then/else statement. If you use r.branch instead (r.branch(u.has_fields('phone'), 1, 0)) it should work.

于 2015-08-07T21:39:48.093 回答