express - Model.aggregate, $filter 即使条件为空
问题描述
我将查询参数传递给 mongoose $filter。
网址:projecttest?assigned_to=jack&created_by=bob&open=true
$filter
条件必须是 an,因为$and
可以在 url 中传递任意数量的参数。- 目前,如果没有在 url 中传递参数,
$filter
则不会返回任何内容。$filter
必须满足所有条件,因为$and
.
如果未传递参数,我可以将其设置为什么,以便不存在的参数不会破坏我的$filter
?
- 我试过
''
和null
。 - 我尝试
$cond
使用 map() 函数构建列表,但它输出一个字符串并且$filter
不接受这个。queryArray = queryParams.map(o => { return{$eq: [$$item.${Object.keys(o)}, "${Object.values(o)}" ]}
;
})
项目是一个猫鼬模型,我在 mongo 文档中过滤了一个名为问题的数组。
Project.aggregate(
[
{
$match: {
'project_title': 'projecttest'
}
}, {
$project: {
issue: {
$filter: {
input: '$issues',
as: 'item',
cond: { $and:
[
{$eq: ['$$item.assigned_to', assigned_to ]} ,
{$eq: ['$$item.created_by', created_by ]},
{$eq: ['$$item.open', open ]},
]
}
}
}
}
}
]
).exec((err, issues) => {
if (err) throw err;
return res.json(issues[0].issue);
})
解决方案
您可以从req.query
第一个开始构建对象,然后将其传递给cond
:
例子:
let cond = Object.entries(req.query).map(el => {$eq: [`$$item.${el[0]}`, el[1] ]});
Project.aggregate(
[
{
$match: {
'project_title': 'projecttest'
}
}, {
$project: {
issue: {
$filter: {
input: '$issues',
as: 'item',
cond: { $and: cond}
}
}
}
}
]
).exec((err, issues) => {
if (err) throw err;
return res.json(issues[0].issue);
})