Ответ 1
Извините за поздний ответ, просто попробовал свой вопрос. Вы должны использовать одно регулярное выражение, а не массив из них, например:
'^[work|accus*|planet]'
Я использую Python в сочетании с MongoDB. У меня есть массив слов, и я использую эти слова для поиска в базе данных Mongo и сопоставления любых документов с соответствующими полями, используя $in
, например,
collection.find({"word":{"$in":words}})
Вышеописанное работает очень хорошо, но я хочу использовать регулярные выражения. Теперь проблема в том, что если одно из слов в массиве было написано accus
вместо accuse
, я хочу, чтобы запрос find()
по-прежнему возвращал документ (запись/строка), относящийся к слову accuse
.
Я пробовал это, которое не работает вообще, никаких результатов не возвращается.
collection.find({"word":{"$in":{"$regex":words}}})
Каждый элемент в массиве читается с ^
перед словом,
например ['^work', '^accus', '^planet']
Я просто поступаю об этом неправильно?
Извините за поздний ответ, просто попробовал свой вопрос. Вы должны использовать одно регулярное выражение, а не массив из них, например:
'^[work|accus*|planet]'
Вы не можете использовать $regex
внутри выражения $in
, но вы можете использовать регулярное выражение JS (тип "/regex/").
Из документов MongoDB в http://docs.mongodb.org/v2.2/reference/operator/query/regex/#in-expressions:
Чтобы включить регулярное выражение в выражение запроса $ in, вы можете использовать только объекты регулярного выражения JavaScript (т.е./pattern/). Вы не можете использовать выражения оператора $ regex внутри $ in.
Кстати, я знаю, что это очень поздний ответ, но, надеюсь, он будет служить запросам будущего...
Используя Spring Data API, можно выполнить запрос следующим образом:
Query query = new Query();
query.addCriteria(Criteria.where("words").in(Pattern.compile(regex-String)));
find(query)
Здесь будут найдены все документы с полем массива под названием words
с элементом в этом массиве, который соответствует регулярному выражению.
В соответствии с 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)});