如何在mongodb中聚合期间有条件地投影字段

如何在mongodb中聚合期间有条件地投影字段,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个用户文档,如: { _id: "s0m3Id", _skills: ["skill1", "skill2"], } 现在我想通过\u skills字段展开此文档,并为每个技能添加分数。因此,我的汇总如下所示: { '$unwind': {'path': '$_skills', 'preserveNullAndEmptyArrays': true}, }, { '$project': { '_skills': 'label': '$_skil

我有一个用户文档,如:

{
    _id: "s0m3Id",
    _skills: ["skill1", "skill2"],
}
现在我想通过
\u skills
字段展开此文档,并为每个技能添加分数。因此,我的汇总如下所示:

{ 
  '$unwind': {'path': '$_skills', 'preserveNullAndEmptyArrays': true},
},
{
  '$project': {
    '_skills':
      'label': '$_skills',
      'skill_score': 1
    },
  }
},
有时,
\u skills
字段可以为空,但是在这种情况下,我仍然希望用户文档通过聚合-因此,
preserveNullAndEmptyArrays
参数。但是,我遇到的问题是,它会将
技能得分
(尽管没有
标签
)投影到具有空
\u技能
数组字段的文档上。因此,当我稍后转到
$group
文档时,这些文档现在有一个非空的
\u skills
数组,其中包含一个对象,即
{skill\u score:1}
。这不是我想要的-我想要那些有空的(或不存在的)
\u skills
字段的文档没有任何技能得分投射到它们上面


那么,如何基于另一个字段的存在有条件地投影一个字段呢?使用
$exists
没有帮助,因为这是用于查询,而不是用于布尔表达式。

已更新

如果
\u skills
不存在,此聚合将
skill\u score
的值设置为
0
,然后使用删除
skill\u score
等于
0
的子文档:

db.project_if.aggregate([
  {
    $unwind: {
      path: '$_skills',
      preserveNullAndEmptyArrays: true,
    }
  },
  {
    $project: {
      _skills: {
        label: '$_skills',
        skill_score: {
          $cond: {
            if: {
              $eq: ['$_skills', undefined]
            },
            then: 0,
            else: 1,
          }
        }
      }
    }
  }, 
  {
    $redact: {
      $cond: {
        if: { $eq: [ "$skill_score", 0 ] },
        then: '$$PRUNE',
        else: '$$DESCEND'
      }
    }
  }
]);
结果是:

[
  { "_id" : '', "_skills" : { "label" : "skill1", "skill_score" : 1 } },
  { "_id" : '', "_skills" : { "label" : "skill2", "skill_score" : 1 } },
  { "_id" : '' },
]

对,这就是我现在所拥有的。但理想情况下,我想要的是:
[{{u id:”,“{u-skills:{label:“skill1”,“skill-score:1},{u-id:”,“{u-skills:{”label:“skill2”,“skill-score:1},{u-id:“},]
我希望最后一项根本没有
skill score
字段。用$redact:)更新它)