当搜索条件复杂时,我想创建一个动态查询对象。
例如:
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.auth
和 req.query.title
;
有什么办法可以去掉这些空值?当对象只有一维时,可以通过循环删除空值,但是当对象充满$and、$or等复杂条件时,如何处理
答案 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
添加检查,如果它们不存在,请不要添加到查询中