あなたは正しい基本的な考えを持っていましたが、 $exists
はクエリ条件であるため、$match
。必要なのは、 $ifNull
>
基本的に同じことを行う演算子:
db.mycollection.aggregate( [
{ "$group": {
"_id" : { "user_id": "$user_id" },
"requestA_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestA", false] }, 1, 0 ]
} },
"requestB_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestB", false] }, 1, 0 ]
} },
"requestC_count": { "$sum": {
"$cond": [ { "$ifNull": ["$requestC", false] }, 1, 0 ]
} },
} },
{ "$project": {
"_id": 0,
"user_id": "$_id.user_id",
"requestA_count": 1,
"requestB_count": 1,
"requestC_count": 1
} }
] );
したがって、 $ifNull
フィールドが存在する場合は現在の値を返し、存在しない場合は「右側」の引数を返します。 false
以外の戻り値 true
であると解釈されます (もちろん、値が実際にfalseでない限り)
基本的に、これにより、ドキュメント内のプロパティの存在を論理的にテストするのと同じ機能が提供されます。