1

感谢这里的答案,我设法通过以下方式获取包含给定字符串的所有行作为特定字段值的子字符串:

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 做到这一点?

4

2 回答 2

3

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

r.db('my_db').table('my_table').filter(lambda row:      
    row["some_key"].contains(lambda key:
        key.match(".\*some_given_string.\*")
    )
)
于 2014-02-16T21:49:39.820 回答
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)
于 2014-02-16T21:57:40.973 回答