Express.js - Mongoose多个或条件

时间:2018-02-08 12:33:38

标签: node.js mongodb api express mongoose

我有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我必须从用户模型中获取数据

寻找急需的帮助

谢谢。

2 个答案:

答案 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)}