我的输入具有自动完成功能,我想按_id
,name
或email
查找用户。
此查询工作正常,但仅使用姓名或电子邮件进行搜索:
var matchRegexp = new RegExp(_.escapeRegExp(req.query.match), 'i');
User.find(
{$or: [{email: matchRegexp}, {name: matchRegexp}]},
{email: 1, name: 1, _id: 0}
).limit(limitResults).exec(
function(error, users) {
if (error) {
return res.status(400).json({
"message": "Query failed",
});
} else {
return res.json({
"results": users
});
}
}
);
如果我尝试在_id
处添加$or
,它将无法通过name
或email
搜索,但可以与_id
一起使用:
{$or: [{email: matchRegexp}, {name: matchRegexp}, {_id: req.query.match}]}
如何使用所有3个选项使其工作?
编辑:
这是错误:
CastError:对于路径“ _id”的值“ ayeye”,转换为ObjectId失败 型号“用户”
它根本不考虑姓名和电子邮件...
答案 0 :(得分:1)
由于您的匹配字符串不是有效的ObjectId
,因此出现此错误。
因此,您可以在此处首先检查有效ObjectId
的验证,然后相应地制定标准。
const ObjectId = require('mongoose').Types.ObjectId
const criteria = { $or: [{ email: matchRegexp },{ name: matchRegexp }] }
If (ObjectId.isValid(matchRegexp)) {
criteria.$or.push({ _id: matchRegexp })
}
User.find(criteria, { email: 1, name: 1, _id: 0 }).limit(limitResults).exec()