使用 $regex 查询 mongoose 不返回任何结果

Posted

技术标签:

【中文标题】使用 $regex 查询 mongoose 不返回任何结果【英文标题】:Query mongoose returns no results with $regex 【发布时间】:2019-04-10 03:09:57 【问题描述】:

尝试使用正则表达式构建猫鼬查询,但由于某种原因它总是返回零结果。

我有一个名为 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...

【问题讨论】:

试试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" 谢谢!第一条评论对我有用。不知道“?:”的存在让生活变得如此轻松! 只是为了确保query.wind_direction = "$regex": new RegExp("\\b(?:" + req.body.wind_direction.join("|") + ")\\b"), "$options": "i" 有效,对吧?还是第二个? 第一个适合我 【参考方案1】:

看来您的req.body.wind_direction 已经是一个可以用来构建交替模式的数组,不需要JSON.stringify 这个数组。要构建替代,您可以使用arr.join("|")

为了避免重复\b,您可以将所有选项分组,non-capturing group 最适合这里:\b(?:term1|term2|termN)\b

你可以使用

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

【讨论】:

以上是关于使用 $regex 查询 mongoose 不返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

mongoose模糊查询

在 mongoose mongodb 中使用 $or 返回文档的一部分

mongoose 查询返回纯 javascript

Node.js 和 Mongoose 正则表达式查询多个字段

无法向 Mongoose 查询返回的对象添加新属性 [重复]

无法向 Mongoose 查询返回的对象添加新属性 [重复]