使用$的条件分组存在于$ cond中

时间:2013-01-08 11:08:04

标签: mongodb mongodb-query

我有两个密钥A和B,它们在文档中的存在是互斥的。当A存在时我必须按A分组,当B存在时我必须按B分组。所以我$project将所需的值$group到一个名为MyKey的计算密钥中,我将在其上执行 {$project: {MyKey: {$cond: [{$exists: ["$A", true]}, "$A", "$B"]}}} 。但看起来我的语法错了。我尝试用两种方式编写$ project:

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

{ "errmsg" : "exception: invalid operator '$exists'", "code" : 15999, "ok" : 0 } ...

但我一直收到错误:

{{1}}

出了什么问题?

4 个答案:

答案 0 :(得分:36)

$cond

中使用$ifNull代替$project
{ $project: {MyKey: {$ifNull: ['$A', '$B'] }}}

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

答案 1 :(得分:20)

如果有人想在$ cond中检查$ exists,则替代方法是使用$ not 与$ cond

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

和$ not的真值表是

enter image description here

希望有助于

答案 2 :(得分:9)

您可以使用

模拟存在
=random_val(2)

如果定义了var

,则返回true

答案 3 :(得分:3)

我在寻找类似问题的过程中找到了你的问题,但在找到钥匙的时候,我正在寻找我的参数。我终于解决了这个问题。

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

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

$或不需要。我把它留在那里......只是为了好玩。我认为它暂时不会影响查询。我稍后会测试速度。