Python 在数据库中组合多个过滤器,并将每个过滤器的结果与排名字段合并
好的,假设我有以下列表:Python 在数据库中组合多个过滤器,并将每个过滤器的结果与排名字段合并,python,rethinkdb,Python,Rethinkdb,好的,假设我有以下列表: [(('a', 'b', 'c'), 1), (('a', 'c'), 2), (('b'), 3)] 该列表由3个元组组成,每个元组有2个元素:过滤器和排名。我想动态创建一个ReQL查询,为上面列表中的每个过滤器过滤一个表(使用has_fields),然后添加一个新字段ranking:[n],当n是上面列表中的排名时 为了了解这一点,下面是我将如何处理多个查询: for filters, ranking in list_: r.table(...).filt
[(('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(...)
我希望将上述查询合并为一个查询,以尽量减少与数据库的交互。感谢您在这方面的帮助。您可以
- 使用
组合查询concatMap
- 用
r.args(过滤器)
- 将
简化为.filter(lambda x:x.has_字段(…)
。has_字段(…)
- 对于
和map
merge
(r.expr(list_)
.concatMap(lambda filts_rank:
r.table(...)
.has_fields(r.args(filts_rank[0]))
.merge({'ranking': filts_rank[1]}))
).run(...)
请注意,如果您在
列表中有重复的键
,表中的某些文档可能会返回多次,每次都有不同的排名。非常感谢!这正是我所需要的:)如果返回重复项,我应该如何消除它们?您可以使用.distinct
方法仅消除重复项distinct
在这种情况下不起作用,因为每个重复文档将具有不同的排名。