web-dev-qa-db-fra.com

Un regroupement conditionnel avec $ existe dans $ cond

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 $projecting 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?

35
Aafreen Sheikh

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.

37
JohnnyHK

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

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

et la table de vérité pour $ pas est aussi

enter image description here

Des espoirs qui aident

21
Imran

Vous pouvez simuler existe avec

$ne : [$var_to_check, undefined]

Cela retourne vrai si la var est définie

10
Delcon

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.

3
Tudor