我有userSchema
我必须使用搜索关键字
//userSchema
const userSchema = new Schema(
{
name: String,
city: String,
postalCode: Number
},
{
timestamps: true
}
);
因此API路由为localhost:3000/api/v1/search/:key
,密钥可以是用户名或city或postalCode,具体取决于我们从集合中获取结果的密钥。
这是我尝试过的userController
index: async (req, res, next) => {
const searchKey = req.params.key;
const searchResult = await User.find({
$or:[{name: searchKey},{city: searchKey},{postalCode: searchKey}]
});
res.status(200).json({
message: 'query was succesfull',
data: searchResult
});
}
如果我将:key
作为加拿大通过,则会收到以下错误消息。如果我将:key
作为 123456 传递,这是postalCode我正在获取数据
{
"error": {
"message": "Cast to number failed for value \"Canada\" at path \"postalCode\" for model \"users\""
}
}
那么我如何使这个查询更加健壮,以便基于:key
我必须从用户模型中获取数据
寻找急需的帮助
谢谢。
答案 0 :(得分:1)
因为在Add
中您声明userSchema
作为数字类型,因此mongoose希望postalCode
为数字,尝试根据searchKey
类型构建查询条件:
searchKey
修改:如果您想按字词相似性进行搜索,请使用$regex运算符,但首先需要将// if searchKey is number
if ( parseInt(searchKey) ) {
var condition = { postalCode: searchKey };
} else {
var condition = { $or:[ { name: searchKey }, { city: searchKey }] };
}
const searchResult = await User.find(condition);
类型更改为字符串:
postalCode
答案 1 :(得分:1)
尝试:
{postalCode: isNaN(parseInt(searchKey)) ? undefined : parseInt(searchKey)}