首页 > 解决方案 > Model.aggregate, $filter 即使条件为空

问题描述

我将查询参数传递给 mongoose $filter。

网址:projecttest?assigned_to=jack&created_by=bob&open=true

如果未传递参数我可以将其设置为什么,以便不存在的参数不会破坏我的$filter

项目是一个猫鼬模型,我在 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);
    })

标签: expressmongoose

解决方案


您可以从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);
})

推荐阅读