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 };
如果你想获得数据,如果匹配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'}}]}
所以可以试试这个代码:
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 };