2017-08-16 158 views
0

我试图复制在MongoDB中此SQL查询:的MongoDB - 查找用户的姓名或姓或名+姓

SELECT * FROM users WHERE 
name LIKE CONCAT('%', :search_txt, '%') OR 
surname LIKE CONCAT('%', :search_txt, '%') OR 
CONCAT(name, ' ', surname) LIKE CONCAT('%', :search_txt, '%') 

到目前为止,我设法通过名字或姓氏,使用此代码搜索,但我可以“T弄清楚如何通过名称+姓还搜索

User.find(
{ 
    "$or": [ 
      {"name" : new RegExp(req.body.term, 'i')}, 
      {"surname" : new RegExp(req.body.term, 'i')} 
     ] 
    } 

感谢

+0

当名称输入为姓名+名称时,SQL查询是否工作?当名称之间有2个空格时它是否工作? –

+0

@Alex Blex我只是这样写的,使其尽可能简单,在我使用它的原始项目中,我还有另一个OR来覆盖Surname + Name的情况。 – Nite

+0

这里更好的选择是“拆分”字符串并将参数作为不同的单词发送到“$或”。正则表达式匹配或连接需要“完整集合扫描”,但提供“完全匹配”的条款不会,因此速度要快几个数量级。你也应该正常化大小写,或者如果你的MongoDB支持大小写不敏感的索引。如果要将查询响应时间降到最低,请避免使用不区分大小写的正则表达式或计算表达式。 –

回答

0

在这里你去:

User.aggregate({ 
    $addFields: { 
     "fullname": { 
      $concat: [ "$name", ' ', "$surname" ] 
     } 
    } 
}, { 
    $match: { 
     "$or": [ 
      {"name": new RegExp(req.body.term, 'i')}, 
      {"surname": new RegExp(req.body.term, 'i')}, 
      {"fullname": new RegExp(req.body.term, 'i')} 
     ]   
    } 
+0

非常感谢,作品 我不得不添加[]以避免“参数必须成为总管道运营商“错误。 – Nite

+0

是的,取决于您可能需要的客户。我的代码在Robomongo控制台内工作。 – dnickless