0

我想根据 URL 的查询参数中可用的值构建查询。示例网址是:-

http://localhost:3000/api/user?page=&status=&search&role_id=

因此,当状态可用时,与其相关的 where 子句应该起作用对于 search 和 role_id 也是如此。

我试图建立一个查询,其中分页部分和搜索参数工作得很好。但是当我传递/设置查询字符串的键时,查询没有结果。

到目前为止我构建的查询是这样的: -

let {page, search, status, role_id} = req.query;
role_id = role_id ? role_id : null;
status = status ? status : null;
const currentPage = parseInt(page) || 1;
const perPage = recordsPerPage;
const userData = await User.find({
                                $and: [
                                    {
                                        $or : [
                                                {username:{'$regex' : search, '$options' : 'i'}},
                                                {email:{'$regex' : search, '$options' : 'i'}}
                                            ]
                                    },
                                    {
                                        $or : [
                                            {status : status}
                                        ]
                                    },
                                    {
                                            $or : [
                                                {role_id : role_id}
                                            ]
                                    },
                                    {
                                        email: { $ne: 'xxxxx@gmail.com' }
                                    }
                                ]
                            })
                            .sort({_id : -1})
                            .populate('role_id')
                            .skip((currentPage - 1) * perPage).limit(perPage);
4

1 回答 1

1

您可以有条件地将字段添加到查询中,而不是尝试依赖$or$and在您的查询中。猫鼬查询只是传递了一个对象,并且可以在函数调用之外构建。

这样,您就不必担心边缘情况,例如null当您从查询中遗漏状态字段时返回状态的用户。

let {page, search, status, role_id} = req.query;
role_id = role_id ? role_id : null;
status = status ? status : null;
const currentPage = parseInt(page) || 1;
const perPage = recordsPerPage;
const query ={
    email: { $ne: 'xxxxx@gmail.com' }
}
if (status) {
    query.status = status
}
if (role_id) {
    query.role_id = role_id
}
if (search) {
    query.username = {'$regex' : search, '$options' : 'i'}
    delete query.email
    query['$and'] = [
        { email: {'$regex' : search, '$options' : 'i'}},
        { email: { $ne: 'xxxxx@gmail.com' } }
    ]
}
const userData = await User.find(query)
    .sort({_id : -1})
    .populate('role_id')
    .skip((currentPage - 1) * perPage).limit(perPage);

顺便说一句,我认为在同一字段(在您的示例中)具有 a$regex和 a的查询在大型集合上执行后可能会非常慢。$neemail

于 2021-04-28T14:14:16.557 回答