如何在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:)更新它)