Имахте правилната основна идея, но $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
се интерпретира като вярно
(освен ако, разбира се, стойността всъщност е false).
По същество това ви дава същата функционалност за логическо тестване за съществуването на свойство в документа.