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 } ...
何が悪いの?
$ifNull
で$cond
の代わりに $project
を使用します。
{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}}
A
が存在し、null
でない場合、その値が使用されます。それ以外の場合は、B
の値が使用されます。
で存在をシミュレートできます
$ne : [$var_to_check, undefined]
Varが定義されている場合、これはtrueを返します
同様の問題を探しているときにあなたの質問を見つけましたが、鍵を求めて、パラメーターを探していました。私はついに問題を解決しました。
これが$ _ id.statusパラメーターに使用したもので、cond内に存在するかどうかを確認します。
$cond: [{
$or: [{
$ne: ["$_id.status", null]
}]
}, 1, null]
$ orは不要です。私はそこにそれを保ちます...ただ楽しみのために。今のところ、クエリにそれほど影響を与えるとは思わない。後で速度をテストします。