我需要使用$ sum转换当前$ group以添加另一个条件:
如果$ eq返回true,实际上对一个字段求和。
现在,如果$ eq返回true并且$ exists返回true,我想对一个字段求和。
我现在的小组是这样的:
"techsWorkQty": {
"$sum": {
"$cond": [
{ "$eq": [
"$works.TechnicianId", id
]},
1,
0
]
}
}
我在哪里可以添加以下子查询?
{
$works.percent:{$exists:true}
}
答案 0 :(得分:1)
$exists
运算符是"查询"仅限运算符,并且只能在$match
管道中用于聚合。为了测试现场存在作为一个逻辑"您想要使用$ifNull
的运算符。 $and
运算符用于组合逻辑条件,也是一个逻辑运算符,而不是同名的查询形式。逻辑运算符可以在$project
和$group
阶段使用:
"techsWorkQty": {
"$sum": {
"$cond": [
{ "$and": [
{ "$ifNull": [ "$works.percent", false ] },
{ "$eq": [ "$works.TechnicianId", id ] }
]},
1,
0
]
}
}
$ifNull
返回其存在的字段值或字段不存在时指定的备用值。在这种情况下,"值"对于当前字段,将在布尔上下文中评估为true
。如果没有字段,则返回false
参数。布尔形式的$and
要求两个逻辑表达式都计算为true,否则它本身会返回false
,它由包装$cond
处理以返回适当的值。
答案 1 :(得分:1)
Project.aggregate([
{
"$unwind": "$works"
},
$group: {
_id:null,
techsWorkQty: {
$sum: {
$cond: {
if: {
$eq: ['$works.percent', id]
},
then: 1,
else: 0
}
}
}
}
])
答案 2 :(得分:0)
您可以使用$and
运算符包含必须满足的多个条件。你可以尝试这样的事情:
"techsWorkQty": {
"$sum": {
"$cond": [
{ "$and" : [
{"$works.percent":{$exists:true}},
{"$eq": ["$works.TechnicianId", id]}
]
},
1,
0
]
}
}