Avevi l'idea di base giusta, ma $exists
è una condizione della query, quindi è valida solo all'interno di un $match
. Quello che vuoi è il $ifNull
operatore per fare essenzialmente la stessa cosa:
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
} }
] );
Quindi $ifNull
restituisce il valore attuale del campo se esiste o viene restituito l'argomento "lato destro" in caso contrario. Il valore restituito diverso da false
è interpretato come true
(a meno che ovviamente il valore non sia effettivamente false).
Essenzialmente questo ti dà la stessa funzionalità di verifica logica per l'esistenza di una proprietà nel documento.