1

我將根據email_address,firstname,lastname,type和phone_number處理用戶搜索。

電話號碼搜索將精確搜索與&沒有國家代碼,而其他人將包含&不區分大小寫的搜索。

所以,我寫了下面的代碼。

User.aggregate(
    [ 
     { 
      "$redact": { 
       "$cond": [ 
        { 
         "$and": [ 
          { 
           "$match": { 
            type: req.body.type, 
            email_address: new RegExp((req.body.email_address || req.body.any || '').toLowerCase(), "i"), 
            "firstname": new RegExp((req.body.firstname || req.body.any || '').toLowerCase(), "i") , 
            "lastname": new RegExp((req.body.lastname || req.body.any || '').toLowerCase(), "i") 
           } 
          }, 
          { 
           "$or": [ 
            { 
             "$setIsSubset": [ 
              [ 
               { "$substr": [ "$phone_number.local_number", 0, -1 ] } 
              ], 
              [req.body.phone_number, req.body.any] 
             ] 
            }, 
            { 
             "$setIsSubset": [ 
              [ 
               { 
                "$concat": [ 
                 { "$substr": [ "$phone_number.country_code", 0, -1 ] }, 
                 { "$substr": [ "$phone_number.local_number", 0, -1 ] } 
                ] 
               } 
              ], 
              [req.body.phone_number, req.body.any] 
             ] 
            }, 
            {}    
           ] 

          } 
         ] 

        }, 
        "$$KEEP", 
        "$$PRUNE" 
       ] 
      } 
     } 
    ], 
    function(err, users) { 
     if (err) { 
      return res.json({ success: false, err: err }); 
     } 
     res.json({ success: true, users: users }); 
    } 
); 

但是,當我運行此代碼,我得到「無效的操作符'匹配'」錯誤。

如果我刪除$匹配,它會將req.body值作爲表達式而不是值來計算,併發出「FieldPath」abc'不以$「開頭的類型錯誤。

所以,我希望得到如何解決這個問題和條件搜索的幫助。

請幫幫我!!!

回答

1

移動$match$redact,因爲它是一個獨立的流水線階段,將提供與正則表達式的初始過濾器,否則會成爲$redact管道內無效:

User.aggregate([ 
    { 
     "$match": { 
      "type": req.body.type, 
      "email_address": new RegExp((req.body.email_address || req.body.any || '').toLowerCase(), "i"), 
      "firstname": new RegExp((req.body.firstname || req.body.any || '').toLowerCase(), "i") , 
      "lastname": new RegExp((req.body.lastname || req.body.any || '').toLowerCase(), "i") 
     } 
    }, 
    { 
     "$redact": { 
      "$cond": [ 
       { 
        "$or": [ 
         { 
          "$setIsSubset": [ 
           [ { "$substr": [ "$phone_number.local_number", 0, -1 ] } ], 
           [req.body.phone_number, req.body.any] 
          ] 
         }, 
         { 
          "$setIsSubset": [ 
           [ 
            { 
             "$concat": [ 
              { "$substr": [ "$phone_number.country_code", 0, -1 ] }, 
              { "$substr": [ "$phone_number.local_number", 0, -1 ] } 
             ] 
            } 
           ], 
           [req.body.phone_number, req.body.any] 
          ] 
         }    
        ] 

       }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
], function(err, users) { 
     if (err) { 
      return res.json({ success: false, err: err }); 
     } 
     res.json({ success: true, users: users }); 
    } 
); 
+1

大回答,非常有幫助。 – BigDaddy