Поиск нескольких слов с помощью find () в MongoDB - PullRequest
10 голосов
/ 03 декабря 2010

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

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

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 28 января 2011

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

'^[work|accus*|planet]'
4 голосов
/ 11 июня 2015

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

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

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

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

1 голос
/ 31 декабря 2015

Согласно Mongo docs правильный путь к этому - следующий

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)});
1 голос
/ 02 июня 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...