2017-08-16 51 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