mongoosefind()文件与两个字段与一个search参数

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

firstName lastName age address 

我需要使用mongoose查找function过滤firstName和lastName的用户。

我的用户界面只传递一个search参数。 数据应按如下过滤

'fistName'像'search参数'&lastName'search参数'。

我传递下面的对象来find函数,它不适合我。

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

如果你想获得数据,如果匹配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 }); 

所以,我认为除了语法缺陷之外,你还有一个逻辑上的缺陷。 除非你故意仅仅寻找具有相同名字和姓氏的人(例如汤姆汤姆),否则你将永远找不到任何人,只要在两个字段中find相同的值。 如果,如我怀疑,你真的想采取一个search条件,看看用户是否有他们的名字或姓氏的string,那么你实际上要使用$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 */ }); 
 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 }); 

您可以尝试通过以下标准

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