Использование Mongo Find () с $in и регулярным выражением

я столкнулся с проблемой. У меня есть массив слов, и я использую эти слова для поиска в базе данных и сопоставления любых документов с соответствующими полями, используя:

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

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

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

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

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

Я просто иду по неправильному пути? Кстати, я использую Python в сочетании с MongoDB. Спасибо заранее.

4 ответов


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

'^[work|accus*|planet]'

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

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

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

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


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

//код

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

//конец кода

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

С Наилучшими Пожеланиями


согласно Монго 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)});