I have two keys A and B and their existence in the document is mutually exclusive. I have to group by A when A exists and group by B when B exists. So I am $project
I found your questions while looking for a similar problem, but insted of a key, I was looking for my parameters. I finally solved the issue.
This is what I used for my $_id.status parameter, to check that if it exists inside the cond.
$cond: [{
$or: [{
$ne: ["$_id.status", null]
}]
}, 1, null]
$or is not needed. I keep it there... just for fun. I don't think it affects the query that much for the moment. I will test the speed later.
if one wants to check $exists with in $cond an alternative approach is to use $not with $cond
{$project: {MyKey: {$cond: [{$not: ["$A"]}, "$B", "$A"]}}}
and truth table for $not is as
Hopes that Helps
You can simulate exists with
$ne : [$var_to_check, undefined]
This returns true if the var is defined
Use $ifNull instead of $cond
in your $project
:
{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}}
If A
exists and is not null
its value will be used; otherwise the value of B
is used.