web-dev-qa-db-ja.com

$ cond内に$ existsがある条件付きグループ化

2つのキーAとBがあり、ドキュメント内でのそれらの存在は相互に排他的です。 Aが存在する場合はAでグループ化し、Bが存在する場合はBでグループ化する必要があります。そう私は $project必要な値をMyKeyという計算されたキーに入力します。このキーで$group。しかし、私は構文を間違えているようです。私は2つの方法で$ projectを書いてみました:

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

そして

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

しかし、私はエラーを取得し続けます:

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

何が悪いの?

35
Aafreen Sheikh

$ifNull$condの代わりに $project を使用します。

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

Aが存在し、nullでない場合、その値が使用されます。それ以外の場合は、Bの値が使用されます。

37
JohnnyHK

$ condで$ existsを確認したい場合、別のアプローチは$ condで$ notを使用することです

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

そして、$ notの真理値表は

enter image description here

役立つ希望

21
Imran

で存在をシミュレートできます

$ne : [$var_to_check, undefined]

Varが定義されている場合、これはtrueを返します

10
Delcon

同様の問題を探しているときにあなたの質問を見つけましたが、鍵を求めて、パラメーターを探していました。私はついに問題を解決しました。

これが$ _ id.statusパラメーターに使用したもので、cond内に存在するかどうかを確認します。

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

$ orは不要です。私はそこにそれを保ちます...ただ楽しみのために。今のところ、クエリにそれほど影響を与えるとは思わない。後で速度をテストします。

3
Tudor