【问题标题】:mongoose find() document with two fields with one search parameter具有两个字段和一个搜索参数的 mongoose find() 文档
【发布时间】:2017-05-14 10:21:14
【问题描述】:

我的节点模型包含以下属性

firstName
lastName
age
address

我需要使用 mongoose 查找函数来过滤带有名字和姓氏的用户。

我的 UI 只传递一个搜索参数。数据应按如下方式过滤

'fistName' 像'搜索参数' & lastName 像'搜索参数'。

我通过以下对象来查找函数。它对我不起作用。

var criteria = {
    'firstName' : req.body.customerName ? { $regex: req.body.customerName, $options: 'i' } : null ,
    'lastName' : req.body.customerName ? { $regex: req.body.customerName, $options: 'i' } : null 
};

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:
    var query = {}
    if(req.body.customerName) {
         query  = {
                  firstName :new RegExp('^'+req.body.customerName+'$', "i"),
                  lastName : new RegExp('^'+req.body.customerName+'$', "i")
              }
    }
     MyModel.find(query , function (err, data) {
       // data.forEach 
    });
    

    【讨论】:

      【解决方案2】:

      您可以尝试通过以下条件

      var criteria = {
          'firstName' : req.body.customerName ? {$regex: req.body.customerName + '.*', $options: 'i'} : null ,
          'lastName' : req.body.customerName ? {$regex: req.body.customerName + '.*', $options: 'i'} : null 
      };
      

      【讨论】:

        【解决方案3】:

        所以,我认为除了句法缺陷之外,您还有逻辑缺陷。除非您有意只寻找名字和姓氏相同的人(例如 Tom Tom),否则您永远不会通过简单地在两个字段中查找具有相同值的人来找到任何人。如果,正如我所怀疑的那样,您真的想采用搜索条件并查看用户的名字或姓氏中是否有该字符串,那么您实际上会想要使用$or

        类似:

        let query = {};
        if(req.body.customerName){
           const nameExp = new RegExp('^'+req.body.customerName+'$', 'i');
           query = { $or : [ { firstName: nameExp }, { lastName: nameExp } ] }; 
        }
        
        MyModel.find(query, (err, data) => { /* do your thing */ });
        

        【讨论】:

          【解决方案4】:

          如果您想在 firstNamelastName 的两个字段 匹配时获取数据,那么您可以使用 $and 运算符和 $regex

          var query = {$and:[{firstName:{$regex: req.body.customerName, $options: 'i'}},{lastName:{$regex: req.body.customerName, $options: 'i'}}]}
          

          如果您想获取数据,如果匹配firstNamelastName 的任何一个字段,那么您可以使用$or 运算符和$regex

          var query = {$or:[{firstName:{$regex: req.body.customerName, $options: 'i'}},{lastName:{$regex: req.body.customerName, $options: 'i'}}]}
          

          所以可以试试这个代码:

          var query = {}
          if(req.body.customerName) {
            query = {$or:[{firstName:{$regex: req.body.customerName, $options: 'i'}},{lastName:{$regex: req.body.customerName, $options: 'i'}}]}
          }
          
          ModelName.find(query , function (err, data) {
             if(error) {
               // return error
             }
             //return data
          });
          

          【讨论】:

          • 无论给定文本是否存在,搜索文本的好解决方案。但是如果我们给出全名就行不通了
          猜你喜欢
          • 1970-01-01
          • 2019-01-27
          • 2022-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-13
          • 1970-01-01
          • 2017-03-07
          相关资源
          最近更新 更多