在 RethinkDB 中组合多个过滤器,并将每个过滤器的结果与排名字段合并

Combine multiple filters in RethinkDB and merge results from each filter with a ranking field

好的,假设我有以下列表:

[(('a', 'b', 'c'), 1), (('a', 'c'), 2), (('b'), 3)]

这个列表由 3 个元组组成,每个元组有 2 个元素:一个过滤器和一个排名。我想动态地创建一个 ReQL 查询,为上面列表中的每个过滤器过滤一个 table(使用 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)
  • 替换 python splats 例如 *filter
  • .filter(lambda x: x.has_fields(...)) 简化为 .has_fields(...)
  • mapmerge
  • 相同

代码看起来像这样:

 (r.expr(list_)
   .concatMap(lambda filts_rank:
      r.table(...)
       .has_fields(r.args(filts_rank[0]))
       .merge({'ranking': filts_rank[1]}))
 ).run(...)

请注意,如果您在 list_ 中有重复的键,table 中的某些文档可能会返回多次,每次都有不同的排名。