Подтвердить что ты не робот

Условная группировка с $существует внутри $cond

У меня есть два ключа A и B, и их существование в документе является взаимоисключающим. Мне нужно группировать А, когда А существует и группируется по В, когда существует Б. Таким образом, я $project вводя требуемое значение в вычисленный ключ MyKey, на котором я буду выполнять $group. Но похоже, что я ошибаюсь в синтаксисе. Я попытался написать $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 } ...

Что пойдет не так?

4b9b3361

Ответ 1

Используйте $ifNull вместо $cond в $project:

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

Если A существует и не null, его значение будет использоваться; в противном случае используется значение B.

Ответ 2

если нужно проверить $существует в $cond, альтернативный подход - использовать $not с $cond

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

и таблица истинности для $not не равна

введите описание изображения здесь

Надежды на помощь

Ответ 3

Вы можете имитировать существующий с помощью

$ne : [$var_to_check, undefined]

Это возвращает true, если var определен

Ответ 4

Я нашел ваши вопросы, ища аналогичную проблему, но при помощи ключа я искал свои параметры. Я, наконец, решил проблему.

Это то, что я использовал для параметра $_id.status, чтобы проверить, существует ли он внутри cond.

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

$или не требуется. Я держу его там... просто для удовольствия. Я не думаю, что это сильно повлияло на запрос. Я буду проверять скорость позже.