68

我有两个键 A 和 B,它们在文档中的存在是互斥的。当A存在时我必须按A分组,当B存在时我必须按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 } ...

怎么了?

4

4 回答 4

76

使用$ifNull而不是$cond在你的$project

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

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

于 2013-01-08T14:09:05.537 回答
49

如果想在 $cond 中检查 $exists,另一种方法是使用 $not 和 $cond

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

$not 的真值表是

在此处输入图像描述

希望有帮助

于 2017-03-09T07:19:41.010 回答
20

你可以模拟存在

$ne : [$var_to_check, undefined]

如果定义了 var,则返回 true

于 2017-09-07T05:20:40.383 回答
1

我在寻找类似问题时发现了您的问题,但是插入了一个键,我正在寻找我的参数。我终于解决了这个问题。

这就是我用于$_id.status参数的内容,以检查它是否存在于 cond 中。

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

$or不需要。我把它放在那里……只是为了好玩。我认为它暂时不会对查询产生太大影响。我稍后会测试速度。

于 2014-11-13T15:47:29.727 回答