RethinkDB: сопоставление подстроки в списке строк

Благодаря ответу здесь, Мне удалось получить все строки, содержащие заданную строку, как подстроку значения определенного поля:

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?


person Kludge    schedule 16.02.2014    source источник


Ответы (2)


В потоке/массиве вы можете использовать contains, который ведет себя как оператор any при задании функции.

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

Краткий ответ:

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)
person Joe Doliner    schedule 16.02.2014
comment
На самом деле, как указывает другой ответ в этой теме, contains - лучший способ сделать это. - person Joe Doliner; 17.02.2014