我有一个用户文档,如:
{
_id: "s0m3Id",
_skills: ["skill1", "skill2"],
}现在,我想通过_skills字段解压这个文档,并为每个技能添加一个分数。所以我的总结看起来是:
{
'$unwind': {'path': '$_skills', 'preserveNullAndEmptyArrays': true},
},
{
'$project': {
'_skills':
'label': '$_skills',
'skill_score': 1
},
}
},有时_skills字段可以是空的,但是在这种情况下,我仍然希望用户文档通过聚合--因此是preserveNullAndEmptyArrays参数。但是,我遇到的问题是,它将把一个skill_score (虽然没有label)投影到有空_skills数组字段的文档上。因此,当我稍后进入$group文档时,这些文档现在有一个非空的_skills数组,其中包含一个对象,即{skill_score: 1}。这不是我想要的--我希望那些有空(或不存在) _skills字段的文档没有任何skill_score投影到它们上。
那么,我如何根据另一个字段的存在有条件地投影一个字段呢?使用$exists没有帮助,因为这是为了查询,而不是布尔表达式。
发布于 2016-12-01 06:25:16
更新的
如果skill_score不存在,则此聚合将将_skills的值设置为0,然后使用$redact删除具有skill_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" : '' },
]https://stackoverflow.com/questions/40899777
复制相似问题