好的,说我有以下清单:
[(('a', 'b', 'c'), 1), (('a', 'c'), 2), (('b'), 3)]
此列表由3个元组组成,每个元组包含2个元素:过滤器和排名。我想动态创建一个ReQL查询,从上面的列表中过滤每个过滤器的表(使用has_fields
),然后在ranking: [n]
时添加一个新字段n
是上面列表中的排名。
为了得到这个想法,以下是我将如何使用多个查询:
for filters, ranking in list_:
r.table(...).filter(lambda doc: doc.has_fields(*filters)).map(lambda doc: doc.merge({'ranking': ranking})).run(...)
我想将上述查询合并为一个查询,以尽量减少与数据库的交互。感谢任何帮助。
答案 0 :(得分:1)
你可以
concatMap
来合并您的查询*filter
r.args(filter)
等python splats
.filter(lambda x: x.has_fields(...))
简化为.has_fields(...)
map
和merge
代码看起来像这样:
(r.expr(list_)
.concatMap(lambda filts_rank:
r.table(...)
.has_fields(r.args(filts_rank[0]))
.merge({'ranking': filts_rank[1]}))
).run(...)
请注意,如果list_
中有重复的密钥,表中的某些文档可能会多次返回,每个文档的排名都不同。