Query mongoose не возвращает результатов с $ regex

1

Попытка построить запрос mongoose с помощью регулярного выражения, но по какой-то причине он всегда возвращает ноль результатов.

У меня есть модель под названием Place со значением wind_direction. wind_direction - это строка, которая выглядит примерно так:

place.wind_direction = "SW, WSW, W, WNW, NW, NE, ENE, E";

Я получаю значения через форму, в данном случае "W, WNW, NW" и пытаюсь построить регулярное выражение следующим образом:

var string = JSON.stringify(req.body.wind_direction)
string = string.replace(/[\[\]"]+/g,'').split(",")
var reg = ""
for(var i = 0; i < string.length; i++){
   reg += "\b" + string[i] + "\b|";
}
reg = "/" + reg.substring(0, reg.length - 1) + "/";
query.wind_direction = { "$regex": reg, "$options": "i" }

Когда я console.log мой запрос выглядит так:

{ wind_direction: { '$regex': '/\bW\b|\bWNW\b|\bNW\b/', '$options': 'i' } }

Затем, когда я запускаю простой запрос с Place.find(query, function (req, res...), он не возвращает результатов. Но когда я проверяю свое регулярное выражение в онлайн-тестере регулярных выражений, это работает.

  • 1
    Попробуйте просто query.wind_direction = { "$regex": new RegExp("\\b(?:" + req.body.wind_direction.join("|") + ")\\b"), "$options": "i" } или query.wind_direction = { "$regex": "\\b(?:" + req.body.wind_direction.join("|") + ")\\b", "$options": "i" }
  • 0
    Спасибо! Первый комментарий работает для меня. Не знал о существовании "?:", Которое делает жизнь намного проще!
Показать ещё 2 комментария
Теги:
mongoose
mongodb-query

1 ответ

2
Лучший ответ

Похоже, что ваш req.body.wind_direction уже является массивом, который вы можете использовать для построения шаблона чередования, нет необходимости JSON.stringify этого массива. Чтобы построить чередование, вы можете использовать arr.join("|").

Чтобы избежать повторения \b, вы можете сгруппировать все альтернативы, и здесь лучше всего подходит группа без захвата: \b(?:term1|term2|termN)\b.

Вы можете использовать

query.wind_direction = { "$regex": new RegExp("\\b(?:" + req.body.wind_direction.join("|") + ")\\b"), "$options": "i" } 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню