因此,对于我在Python 2.7中使用最新RethinkDB(1.14)工作的一些代码,这是一个有趣的简化代码片段。我的问题是现在我需要添加另一个条件,并且有太多可能的组合。这可以在一个过滤器语句中完成吗?
query = r.table('messages').order_by(r.desc('created'))
if tag is not None and read is not None:
query = query.filter(lambda n: (n['user_id'] == user_id) &
(n['tags'].contains(tag)) &
(n['read'] == read))
elif read is not None:
query = query.filter(lambda n: (n['user_id'] == user_id) &
(n['read'] == read))
elif tag is not None:
query = query.filter(lambda n: (n['user_id'] == user_id) &
(n['tags'].contains(tag)))
else:
query = query.filter(lambda n: n['user_id'] == user_id)
fields_list = query.skip(skip)\
.limit(limit)\
.run(g.db_conn)
作为旁注,如果链接过滤器有效,这将是所以更容易,基本上充当and
。但是现在看来,每个RethinkDB查询只能有一个过滤器。
编辑:不确定以前发生了什么,但链接过滤器确实有用。
答案 0 :(得分:1)
事实证明这确实有用!
def _(n):
return (n['user_id'] == user_id) & \
(n['tags'].contains(tag) if tag is not None else True) & \
(n['read'] == read if read is not None else True)
query = r.table('messages') \
.order_by(r.desc('created')) \
.filter(_) \
.skip(skip)\
.limit(limit)
fields_list = query.run(g.db_conn)
编辑:也可能:
query = r.table('messages') \
.order_by(r.desc('created')) \
.filter(r.row['user_id'] == user_id) \
.filter(r.row['tags'].contains(tag) if tag is not None else True) \
.filter(r.row['read'] == read if read is not None else True) \
.skip(skip) \
.limit(limit)
fields_list = query.run(g.db_conn)