RethinkDB:​​匹配字符串列表中的子字符串

时间:2014-02-16 16:29:22

标签: rethinkdb rethinkdb-python

感谢答案here,我想通过以下方式将包含给定字符串的所有行作为特定字段值的子字符串:

r.db('my_db').table('my_table').filter(lambda row: row['some_key'].match(".\*some_given_string.\*"))

如果我想得到类似的结果怎么办,但这一次,“some_key”是字符串的列表而不是单个字符串?说下表:

[{"name": "row1", "some_key": ["str1", "str2"]}, {"name": "row2", "some_key": ["str3", "blah"]}, {"name": "row3", "some_key": ["blah", "blahblah"]}]

我想查找".*tr.*"并获取前两行,因为最后一行在“some_key”下面有一个列表,其中没有任何字符串中包含“tr”。

我怎么能用rethinkdb做到这一点?

2 个答案:

答案 0 :(得分:3)

在流/数组上,您可以使用contains,在给定函数时,其行为类似于any运算符。

r.db('my_db').table('my_table').filter(lambda row:      
    row["some_key"].contains(lambda key:
        key.match(".\*some_given_string.\*")
    )
)

答案 1 :(得分:1)

简短回答:

def has_match(row, regex):
    return row['some_key']
           .map(lambda x: x.match(regex))
           .reduce(lambda x,y: x | y)


my_table.filter(lambda row: has_match(row, ".*tr.*"))

更长的答案:

match是一种可以在字符串上调用的方法。通常在ReQL中,如果有一个X数组,并且要将一个函数应用于要使用map命令的数组的每个元素。例如,如果您运行:

r.expr(["foo", "boo", "bar"]).map(lambda x: x.match(".\*oo"))

你会回来的:

[True, True, False]

我对你的问题有点不清楚,但我认为你想要的是获得所有这些字符串与正则表达式匹配的文档。要查看是否有任何匹配,您需要使用or来减少布尔值,因此它将是:

list_of_bools.reduce(lambda x,y: x | y)