否:[DUPLICATE]:此问题先前未得到回答,因此被不公正地否决了。来自不同来源的两个明显的答案是关于不同的事情。结合起来,他们可能会在一定程度上部分回答问题,但他们并未解决此处所问问题的非常具体的情况(例如,他们都没有解释如何在与变量进行比较之前解析电子邮件)。我需要提取电子邮件的前半部分,将其与字符串变量进行比较,然后使用猫鼬执行查询。
对于这个问题(/^([^@]*)/
,我找到了许多 partial 答案,但是没有显示如何将过滤器应用于给定 string 部分电子邮件字段和猫鼬查询中的“ strong”。
有了这个,我有了一个搜索(由用户提供),但是没有一个过滤器:
{ email: { $regex: search, $options: "i" } }
有了这个,我有一个过滤器,但没有搜索:
{ email: { $regex: /^([^@]*)/, $options: "i" } }
我需要找到一种一次性完成两项操作的方法(仅搜索具有给定字符串变量的电子邮件的前半部分)。我的意图是忽略@符号后的所有内容(包括@),这些内容不应包含在字符串变量(“搜索”)中。我需要找到一种在正则表达式过滤器中插入 search 的方法。
同样,它应该忽略/排除从'@'到电子邮件地址末尾的所有内容(搜索中不应考虑此部分)。
谢谢!
答案 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"}});