2013-01-08 9 views
23

Mam dwa klucze A i B, a ich istnienie w dokumencie wzajemnie się wyklucza. Muszę pogrupować według A, kiedy A istnieje i pogrupować według B, gdy istnieje B. Więc jestem $project ing wymaganej wartości do obliczonego klucza o nazwie MyKey, na którym wykonam $group. Ale wygląda na to, że popełniam błąd przy użyciu składni. Próbowałem pisać $ projekt na dwa sposoby:

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

i

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

ale wciąż otrzymuję błąd:

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

co się dzieje nie tak?

Odpowiedz

19

Zastosowanie $ifNull zamiast $cond w swojej $project:

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

Jeśli A istnieje i nie jest null jego wartość zostanie wykorzystana; w przeciwnym razie używana jest wartość B.

+0

Jeszcze raz dziękuję! :-) Zmarnowałem tak dużo czasu na to .. –

+0

Czy mogę używać zarówno $ isNull, jak i cond? –

1

Znalazłem twoje pytania, szukając podobnego problemu, ale wstawiłem klucz, szukałem moich parametrów. W końcu rozwiązałem problem.

To jest to, czego użyłem dla mojego parametru $ _id.status, aby sprawdzić, czy istnieje w cond.

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

$ lub nie jest potrzebne. Trzymam to ... tylko dla zabawy. Nie sądzę, że ma to wpływ na zapytanie w tej chwili. Testuję prędkość później.

9

jeśli ktoś chce sprawdzić $ istnieje ze w $ dyr Alternatywnym podejściem jest użycie $ nie z $ dyr

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

i tabeli prawdy dla $ nie jest tak

enter image description here

Nadzieja, że ​​pomaga

4

Można symulować z

$ne : [$var_to_check, undefined] 

To zwraca wartość true, jeśli zmienna jest zdefiniowana