Поиск нескольких слов с помощью find() в MongoDB

Я использую Python в сочетании с MongoDB. У меня есть массив слов, и я использую эти слова для поиска в базе данных Mongo и сопоставления любых документов с соответствующими полями, используя $in, например,

collection.find({"word":{"$in":words}})

Вышеописанное работает очень хорошо, но я хочу использовать регулярные выражения. Теперь проблема в том, что если одно из слов в массиве было написано accus вместо accuse, я хочу, чтобы запрос find() по-прежнему возвращал документ (запись/строка), относящийся к слову accuse.

Я пробовал это, которое не работает вообще, никаких результатов не возвращается.

collection.find({"word":{"$in":{"$regex":words}}})

Каждый элемент в массиве читается с ^ перед словом, например ['^work', '^accus', '^planet']

Я просто поступаю об этом неправильно?

Ответ 1

Извините за поздний ответ, просто попробовал свой вопрос. Вы должны использовать одно регулярное выражение, а не массив из них, например:

'^[work|accus*|planet]'

Ответ 2

Вы не можете использовать $regex внутри выражения $in, но вы можете использовать регулярное выражение JS (тип "/regex/").

Из документов MongoDB в http://docs.mongodb.org/v2.2/reference/operator/query/regex/#in-expressions:

Чтобы включить регулярное выражение в выражение запроса $ in, вы можете использовать только объекты регулярного выражения JavaScript (т.е./pattern/). Вы не можете использовать выражения оператора $ regex внутри $ in.

Кстати, я знаю, что это очень поздний ответ, но, надеюсь, он будет служить запросам будущего...

Ответ 3

Используя Spring Data API, можно выполнить запрос следующим образом:

Query query = new Query();
query.addCriteria(Criteria.where("words").in(Pattern.compile(regex-String)));
find(query)

Здесь будут найдены все документы с полем массива под названием words с элементом в этом массиве, который соответствует регулярному выражению.

Ответ 4

В соответствии с Mongo docs currect way to this это следующая

var words = [/hello/, /^world/];// array of regex
db.getCollection('word collection').find({"word" : {$in : words}});

Чтобы выполнить это в JS, вы можете создать массив объектов RegEXp и передать этот массив как значение $in, как это:

words = words.map(function(v){return new RegExp(v)});