如何在Mongoose查询中将变量与已解析的电子邮件进行比较?

时间:2018-09-25 13:00:01

标签: regex mongoose

:[DUPLICATE]:此问题先前未得到回答,因此被不公正地否决了。来自不同来源的两个明显的答案是关于不同的事情。结合起来,他们可能会在一定程度上部分回答问题,但他们并未解决此处所问问题的非常具体的情况(例如,他们都没有解释如何在与变量进行比较之前解析电子邮件)。我需要提取电子邮件的前半部分,将其与字符串变量进行比较,然后使用猫鼬执行查询。

对于这个问题(/^([^@]*)/,我找到了许多 partial 答案,但是没有显示如何将过滤器应用于给定 string 部分电子邮件字段和猫鼬查询中的“ strong”。

有了这个,我有了一个搜索(由用户提供),但是没有一个过滤器

{ email: { $regex: search, $options: "i" } }

有了这个,我有一个过滤器,但没有搜索

{ email: { $regex: /^([^@]*)/, $options: "i" } }

我需要找到一种一次性完成两项操作的方法(仅搜索具有给定字符串变量的电子邮件的前半部分)。我的意图是忽略@符号后的所有内容(包括@),这些内容不应包含在字符串变量(“搜索”)中。我需要找到一种在正则表达式过滤器中插入 search 的方法。

同样,它应该忽略/排除从'@'到电子邮件地址末尾的所有内容(搜索中不应考虑此部分)。

  • 搜索是变量

谢谢!

1 个答案:

答案 0 :(得分:1)

/^[^@]*search/可以解决问题。这将从字符串的开头搜索文字匹配search。只要字符串开头和search之间的字符不是@字符。这意味着"foo bar search"会命中,但"foo@bar search"不会命中。

如果 search 是一个变量,则您可能想看看Javascript Regex: How to put a variable inside a regular expression?


结合以上两个选项,您将获得:

var regex = new RegExp('^[^@]*' + search);
User.find({email: {$regex: regex, $options: "i"}});

但是,如果search包含不应被解释为正则表达式的用户内容,则应escape这样的内容:

// Assuming that the following helper is present.
RegExp.escape = function(s) {
    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
};

var regex = new RegExp('^[^@]*' + RegExp.escape(search));
User.find({email: {$regex: regex, $options: "i"}});

MongoDB also allows a string to be passed as $regex value.因此,无需创建JS RegExp对象,您可以将以上内容简化为:

User.find({email: {$regex: '^[^@]*' + RegExp.escape(search), $options: "i"}});