Le groupement conditionnel avec $existe à l'intérieur de $cond

j'ai deux clés A et B et leur existence dans le document est mutuellement exclusive. Je dois Grouper par A quand a existe et grouper par B quand B existe. Donc, je suis $project ing la valeur requise dans une clé de calcul appelée MyKey sur laquelle je vais effectuer un $group. Mais il semble que je suis en train de faire une erreur avec la syntaxe. J'ai essayé d'écrire $projet de deux façons:

{$project: {MyKey: {$cond: [{$exists: ["$A", true]}, "$A", "$B"]}}}

et

{$project: {MyKey: {$cond: [{"A": {$exists:true}}, "$A", "$B"]}}}

mais je continue à obtenir le erreur:

{ "errmsg" : "exception: invalid operator '$exists'", "code" : 15999, "ok" : 0 } ...

Ce qui va mal?

27
demandé sur Aafreen Sheikh 2013-01-08 15:08:03

4 réponses

Utiliser $ifNull au lieu de $cond dans votre $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é.

28
répondu JohnnyHK 2014-02-13 12:26:59

si on veut vérifier $existe dans $cond une approche alternative est d'utiliser $pas avec $cond

{$project: {MyKey: {$cond: [{$not: ["$A"]}, "$B", "$A"]}}} 

et table de vérité pour $n'est que

enter image description here

l'Espoir qui Aide

13
répondu Imran 2017-03-09 07:19:41

Vous pouvez simuler existe avec

$ne : [$var_to_check, undefined]

renvoie true si le var est défini

7
répondu Delcon 2017-09-07 05:20:40

j'ai trouvé vos questions en cherchant un problème similaire, mais avec une clé insérée, je cherchais mes paramètres. J'ai finalement résolu le problème.

c'est Ce que j'ai utilisé pour mon $_id.l'état paramètre, pour vérifier s'il existe à l'intérieur de la cond.

$cond: [{
     $or: [{
          $ne: ["$_id.status", null]
     }]
}, 1, null]

$ n'est pas nécessaire. Je l'y maintenir... juste pour le plaisir. Je ne pense pas que cela affecte la requête pour l'instant. Je testerai la vitesse plus tard.

3
répondu Tudor 2016-11-07 18:50:03