Rethinkdb mapreduce not has_fields 无法正常工作
Rethinkdb mapreduce not has_fields not working properly
我正在尝试查找没有 phone 数字的记录(按公司分组)的百分比。我可以通过以下两个查询来做到这一点:
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 在单个查询中执行此操作并且可能更高效。这是我的查询,但它不起作用,因为两个数字(phone 和计数)相同:
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)
),它应该可以工作。
我正在尝试查找没有 phone 数字的记录(按公司分组)的百分比。我可以通过以下两个查询来做到这一点:
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 在单个查询中执行此操作并且可能更高效。这是我的查询,但它不起作用,因为两个数字(phone 和计数)相同:
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)
),它应该可以工作。