我有两个键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 } ...
出什么事了?
6条答案
按热度按时间cbjzeqam1#
在
$project
中使用$ifNull
而不是$cond
:如果
A
存在并且不是null
,则将使用其值;否则使用B
的值。mrfwxfqh2#
如果要在$cond中检查$exists,另一种方法是将$not与$cond一起使用
$not的真值表是
帮助的希望
ojsjcaue3#
您可以使用模拟存在
如果定义了var,则返回true
uoifb46i4#
我在$cond和check中找到的一些共享已经存在:
332nm8kg5#
我发现你的问题时,寻找一个类似的问题,但insts的关键,我正在寻找我的参数。我终于解决了这个问题。
这是我在 $_id.status 参数中使用的,用来检查它是否存在于cond中。
不需要 *$或 *,我把它放在那里......只是为了好玩,我觉得暂时不会对查询有太大影响,稍后测试速度。
o8x7eapl6#
可以使用以下语句实现聚合或
$expr
语句中{ k: { $exists: true } }
的严格等效:{ $or: ['$k', { $in: ['$k', [null, 0, false]] }] }
使用
$eq
或$in
比较字段值与null
是严格的,如果未设置字段,则将返回false。这些情况的真值表如下
因此,要知道字段何时被设置,我们必须将表的 * truthy * 和 * falsy * 列切换为
true
。真实值是......嗯,真实的,所以我们可以按原样使用它们:
{ $or: ['$k', { $eq: ['$k', null] }] }
在MongoDB中,falsy值是
0
,false
和null
,因此我们可以将缺失的值添加到$in
子句中:{ $in: ['$k', [null, 0, false]] }
通过合并它们,我们得到
{ $or: ['$k', { $in: ['$k', [null, 0, false]] }] }
,如果字段为真,则返回true
,如果未设置,则返回0
、false
或null
和false
。