Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据库中组合多个过滤器,并将每个过滤器的结果与排名字段合并_Python_Rethinkdb - Fatal编程技术网

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
在这种情况下不起作用,因为每个重复文档将具有不同的
排名。