mongoose find()文档,带有一个搜索参数的两个字段

时间:2016-12-30 04:44:03

标签: node.js mongodb mongoose

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

firstName
lastName
age
address

我需要使用mongoose find函数来使用firstName和lastName过滤用户。

我的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 
};

4 个答案:

答案 0 :(得分:10)

如果您希望获得数据,如果与<{1}}和firstName两个字段匹配,那么您可以将lastName运算符与$and一起使用。

$regex

如果您希望获得数据,如果var query = {$and:[{firstName:{$regex: req.body.customerName, $options: 'i'}},{lastName:{$regex: req.body.customerName, $options: 'i'}}]} firstName的任何一个匹配,那么您可以lastName运算符与$or一起使用}。

$regex

所以可以试试这段代码:

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

答案 1 :(得分:1)

所以,我认为除了语法缺陷之外,你还有一个逻辑缺陷。除非你故意只寻找具有相同名字和姓氏的人(例如汤姆汤姆),否则你永远不会找到任何人,只需在每个字段中查找具有相同值的每个字段。如果,正如我怀疑的那样,您确实想要采用搜索条件并查看用户是否在 中使用他们的名字或姓氏,那么您实际上想要使用{{1} }。

类似的东西:

$or

答案 2 :(得分:0)

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 
});

答案 3 :(得分:0)

您可以尝试通过以下条件

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