1

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"]}]

最初の 2 行を探して".*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 に答える