Mongoose:使用正则表达式查询全名

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 SmithJohn Kennedy.

  • 查询John应返回John SmithJohn Kennedy
  • 查询John Sm应该只返回John Smith

ZeM*_*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)