Использование 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)});