mongodb $cond中存在$的条件分组

s71maibg  于 2023-02-11  发布在  Go
关注(0)|答案(6)|浏览(199)

我有两个键A和B,它们在文档中的存在是互斥的。当A存在时,我必须按A分组,当B存在时,我必须按B分组。所以我将所需的值$project ing到一个名为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 } ...
出什么事了?

cbjzeqam

cbjzeqam1#

$project中使用$ifNull而不是$cond

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

如果A存在并且不是null,则将使用其值;否则使用B的值。

mrfwxfqh

mrfwxfqh2#

如果要在$cond中检查$exists,另一种方法是将$not与$cond一起使用

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

$not的真值表是

帮助的希望

ojsjcaue

ojsjcaue3#

您可以使用模拟存在

$ne : [$var_to_check, undefined]

如果定义了var,则返回true

uoifb46i

uoifb46i4#

我在$cond和check中找到的一些共享已经存在:

$cond: {
  if: "$A1",
  then: "$A1",
  else: "$B1"
}
332nm8kg

332nm8kg5#

我发现你的问题时,寻找一个类似的问题,但insts的关键,我正在寻找我的参数。我终于解决了这个问题。
这是我在 $_id.status 参数中使用的,用来检查它是否存在于cond中。

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

不需要 *$或 *,我把它放在那里......只是为了好玩,我觉得暂时不会对查询有太大影响,稍后测试速度。

o8x7eapl

o8x7eapl6#

    • TL; DR:**

可以使用以下语句实现聚合或$expr语句中{ k: { $exists: true } }的严格等效:{ $or: ['$k', { $in: ['$k', [null, 0, false]] }] }

    • 说明:**

使用$eq$in比较字段值与null是严格的,如果未设置字段,则将返回false。
这些情况的真值表如下

| null  | unset | truthy | falsy |
------------------------+-------+-------+--------+-------+
{ $eq: ['$k', null] }   | TRUE  | FALSE | FALSE  | FALSE |
{ $in: ['$k', [null]] } | TRUE  | FALSE | FALSE  | FALSE |

因此,要知道字段何时被设置,我们必须将表的 * truthy * 和 * falsy * 列切换为true
真实值是......嗯,真实的,所以我们可以按原样使用它们:{ $or: ['$k', { $eq: ['$k', null] }] }
在MongoDB中,falsy值是0falsenull,因此我们可以将缺失的值添加到$in子句中:{ $in: ['$k', [null, 0, false]] }
通过合并它们,我们得到{ $or: ['$k', { $in: ['$k', [null, 0, false]] }] },如果字段为真,则返回true,如果未设置,则返回0falsenullfalse

相关问题