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

时间:2015-04-15 15:34:25

标签: 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(...).filter(lambda doc: doc.has_fields(*filters)).map(lambda doc: doc.merge({'ranking': ranking})).run(...)

我想将上述查询合并为一个查询,以尽量减少与数据库的交互。感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你可以

  • 使用concatMap来合并您的查询
  • *filter
  • 替换r.args(filter)等python splats
  • .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_中有重复的密钥,表中的某些文档可能会多次返回,每个文档的排名都不同。