jav*_*sas 3 regex mongoose mongodb node.js
我正在使用以下代码通过名字或姓氏搜索用户:
var re = new RegExp(req.params.search, 'i');
User.find()
.or([{ firstName: re }, { lastName: re }])
.exec(function(err, users) {
res.json(JSON.stringify(users));
});
Run Code Online (Sandbox Code Playgroud)
如果search等于'John'或等于'Smith',则效果很好'John Sm'.
有任何线索如何完成这种查询?
谢谢!
免责声明:这个问题最初出现在3年前的上一个问题的评论中,仍然没有答案.我正在开始一个新线程,因为1)这不是主要问题而且2)我认为这很有趣,有自己的主题
编辑:
假设数据库包含两个记录:John Smith和John Kennedy.
John应返回John Smith和John KennedyJohn Sm应该只返回John SmithZeM*_*oon 11
用词分隔搜索词,并使用交替运算符('|')将它们分开.
var terms = req.params.search.split(' ');
var regexString = "";
for (var i = 0; i < terms.length; i++)
{
regexString += terms[i];
if (i < terms.length - 1) regexString += '|';
}
var re = new RegExp(regexString, 'ig');
Run Code Online (Sandbox Code Playgroud)
对于输入'John Smith',这将创建一个看起来像的正则表达式/John|Smith/ig.对于单个单词,这将返回true,并且当输入正好时,它将工作'John Sm'
你可以玩这个正则表达式来获得一个更适合您的需求.
编辑:
这里的问题是你的名字字段是分开的.在这种情况下,将相同的正则表达式应用于这两个字段将不会产生您想要的结果.正则表达式需要应用于具有完整名称的相同字段.
可能的解决方案是使用聚合:
User.aggregate()
.project({fullName: {$concat: ['$firstName', ' ', '$lastName']}})
.match({fullName: re})
Run Code Online (Sandbox Code Playgroud)