在 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(...)
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_
中有重复的键,table 中的某些文档可能会返回多次,每次都有不同的排名。
好的,假设我有以下列表:
[(('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(lambda x: x.has_fields(...))
简化为.has_fields(...)
map
和merge
相同
*filter
代码看起来像这样:
(r.expr(list_)
.concatMap(lambda filts_rank:
r.table(...)
.has_fields(r.args(filts_rank[0]))
.merge({'ranking': filts_rank[1]}))
).run(...)
请注意,如果您在 list_
中有重复的键,table 中的某些文档可能会返回多次,每次都有不同的排名。