J'ai deux clés A et B et leur existence dans le document s'exclut mutuellement. Je dois grouper par A quand A existe et grouper par B quand B existe. Moi aussi $project
ing la valeur requise dans une clé calculée appelée MyKey sur laquelle je vais effectuer un $group
. Mais il semble que je fais une erreur avec la syntaxe. J'ai essayé d'écrire $ project de deux manières:
{$project: {MyKey: {$cond: [{$exists: ["$A", true]}, "$A", "$B"]}}}
et
{$project: {MyKey: {$cond: [{"A": {$exists:true}}, "$A", "$B"]}}}
Mais je continue à recevoir l'erreur:
{ "errmsg" : "exception: invalid operator '$exists'", "code" : 15999, "ok" : 0 } ...
Qu'est-ce qui ne va pas?
Utilisation $ifNull
au lieu de $cond
dans ton $project
:
{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}}
Si A
existe et n'est pas null
sa valeur sera utilisée; sinon, la valeur de B
est utilisée.
Vous pouvez simuler existe avec
$ne : [$var_to_check, undefined]
Cela retourne vrai si la var est définie
J'ai trouvé vos questions en cherchant un problème similaire, mais au lieu d'une clé, je cherchais mes paramètres. J'ai finalement résolu le problème.
C'est ce que j'ai utilisé pour mon paramètre $ _ id.status, pour vérifier que s'il existe à l'intérieur du cond.
$cond: [{
$or: [{
$ne: ["$_id.status", null]
}]
}, 1, null]
$ o n'est pas nécessaire. Je le garde là ... juste pour le plaisir. Je ne pense pas que cela affecte la requête autant pour le moment. Je testerai la vitesse plus tard.