Ответ 1
Используйте $ifNull
вместо $cond
в $project
:
{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}}
Если A
существует и не null
, его значение будет использоваться; в противном случае используется значение B
.
У меня есть два ключа 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 } ...
Что пойдет не так?
Используйте $ifNull
вместо $cond
в $project
:
{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}}
Если A
существует и не null
, его значение будет использоваться; в противном случае используется значение B
.
если нужно проверить $существует в $cond, альтернативный подход - использовать $not с $cond
{$project: {MyKey: {$cond: [{$not: ["$A"]}, "$B", "$A"]}}}
и таблица истинности для $not не равна
Надежды на помощь
Вы можете имитировать существующий с помощью
$ne : [$var_to_check, undefined]
Это возвращает true, если var определен
Я нашел ваши вопросы, ища аналогичную проблему, но при помощи ключа я искал свои параметры. Я, наконец, решил проблему.
Это то, что я использовал для параметра $_id.status, чтобы проверить, существует ли он внутри cond.
$cond: [{
$or: [{
$ne: ["$_id.status", null]
}]
}, 1, null]
$или не требуется. Я держу его там... просто для удовольствия. Я не думаю, что это сильно повлияло на запрос. Я буду проверять скорость позже.