猫鼬:过滤查询对象参数

时间:2021-04-15 03:35:59

标签: javascript node.js mongodb mongoose

当搜索条件复杂时,我想创建一个动态查询对象。

例如:

dbQueryObj = {
            $and: [{
                $or: [
                    { auth: req.query.auth },
                    { title: req.query.title }
                ],
                date: {
                    $gte: new Date(req.query.startDate),
                    $lt: new Date(req.query.endDate)
                }
            }]
        }

有些值可能不填,比如req.query.endDate可能为null,搜索对象会变成类似下面这样:

 cteatedDate: {
     $gte: 'Wed Apr 07 2021 00:00:00  GMT 0800',
     $lt: null // or Invalid Date, 'null', ..etc 
 }

$lt: null,这个条件会影响搜索结果,什么也找不到。 或者其他参数可能为空,例如 req.query.authreq.query.title;

有什么办法可以去掉这些空值?当对象只有一维时,可以通过循环删除空值,但是当对象充满$and、$or等复杂条件时,如何处理

1 个答案:

答案 0 :(得分:0)

您可以执行类似操作 - 仅添加在 query 中可用的值

if (req.query) {
    const query = req.query;

    const orQuery = [];

    if (query.auth) orQuery.push({ auth: query.auth })
    if (query.title) orQuery.push({ title: query.title })

    const dateQuery = {};

    if (query.startDate) dateQuery['$gte'] = new Date(query.startDate);
    if (query.endDate) dateQuery['$lt'] = new Date(query.endDate);

    const dbQueryObj = {
        $and: [{
            $or: orQuery,
            date: dateQuery
        }]
    };

}

此外,您可以为 orQuery dateQuery 添加检查,如果它们不存在,请不要添加到查询中