2013-01-08 7 views
23

Ho due chiavi A e B e la loro esistenza nel documento si escludono a vicenda. Devo raggruppare per A quando A esiste e raggruppare per B quando B esiste. Quindi sono $project il valore richiesto in una chiave calcolata chiamata MyKey su cui eseguirò un $group. Ma sembra che sto facendo un errore con la sintassi. Ho provato a scrivere $ progetto in due modi:

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

e

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

Ma continuo a ricevere l'errore:

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

cosa sta andando male?

risposta

19

Uso $ifNull invece di $cond nel vostro $project:

{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}} 

Se A esiste e non è null verrà usato il suo valore; in caso contrario viene utilizzato il valore di B.

+0

Grazie ancora! :-) Ho perso così tanto tempo su questo .. –

+0

posso usare sia $ isNull che cond? –

1

Ho trovato le tue domande mentre cercavo un problema simile, ma al posto di una chiave, cercavo i miei parametri. Ho finalmente risolto il problema.

Questo è quello che ho usato per il mio parametro $ _id.status, per verificare se esiste all'interno del cond.

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

$ o non è necessaria. Lo tengo lì ... solo per divertimento. Non penso che influenzi la query tanto per il momento. Metterò alla prova la velocità più tardi.

9

se si vuole controllare $ esiste con in $ cond un approccio alternativo è quello di utilizzare $ non con $ cond

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

e tabella di verità per $ non è così

enter image description here

Speranze che aiuta

4

È possibile simulare esiste con

Restituisce true se la var è definita