如何在mongodb聚合中检查子字段是不是存在且不为空?

Posted

技术标签:

【中文标题】如何在mongodb聚合中检查子字段是不是存在且不为空?【英文标题】:How to check if sub-field exists and is not null in mongodb aggregation?如何在mongodb聚合中检查子字段是否存在且不为空? 【发布时间】:2017-08-16 05:42:58 【问题描述】:

我遇到了一个非常烦人的问题,我似乎无法为我的具体情况找到任何解决方案。在我的 mongo 聚合管道中,我想添加一个字段,并且根据另一个字段的子字段的存在,我想分配该其他字段的子字段的值,或者如果该其他字段的子字段不存在,则为 1。

这是我尝试过的:

pipelineStages.push(
$addFields: 
    field: 
        $cond: [
             $ne: ["$otherField.subField", null], 
                    "$otherField.subField", 1]
             
        
     
 );

但是,它仅适用于该字段存在的情况。另一方面,该新字段根本没有添加到管道中。任何想法我做错了什么?

【问题讨论】:

类似$addFields: field: $ifNull: [ "$otherField.subField", 1 ] MongoDB aggregate by field exists的可能重复 没有。就像我说的,我需要一个子字段的值,而不是一个字段。下面的答案没有涵盖这一点。 假设您有两个带有"otherField":"subField":2, "extraField":3, "otherField":"oneField":3 的文档。如果您运行上述查询,您应该得到"otherField" : "subField" : 2, "extraField" : 3, "field" : 2 "otherField" : "oneField" : 3 , "field" : 1 的输出。这不是你需要的吗?如果没有,请考虑在帖子中添加一些示例文档。 【参考方案1】:

你试过这个版本的条件吗:

pipelineStages.push( $addFields: 
    field: 
        $cond: [$and: ["$otherField": "$exists": true, "$otherField.subField": "$exists": true], "$otherField.subField", 1]
        
    
 );

【讨论】:

是的,它不会让我用'.'指定一个字段签名。 如果尝试像我此时编辑代码?也没有效果?【参考方案2】:

$ifNull 包装在$cond 中可以解决问题,即使存在子字段问题。

pipelineStages.push(
    $addFields: 
        newField: 
            $cond: [
                 
                    "$ifNull": [ 
                        "$otherField.subField", 
                        false 
                    ] 
                ,
                "$otherField.subField",
                1
            ]
        
     
 );

【讨论】:

【参考方案3】:

要检查字段是否存在且不为空,请使用:

pipelineStages.push( 
  $addFields: 
    field: 
      $cond: [
        "$gt": [$otherField, null], "$otherField.subField", 1
      ]
    
  
)

相反,要检查该字段是否不存在或为空,请使用:

"$lte": [$otherField, null]

【讨论】:

以上是关于如何在mongodb聚合中检查子字段是不是存在且不为空?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb检查数组的子文档中是否存在字段

如何在数组的 mongodb 的子字段中进行聚合和分组?

MongoDB 字段索引后,如何快速检查一个该字段的数值是不存在的

如何检查Firebase中是不是存在具有多个字段的节点(子)?

用于算术运算的 MongoDB 聚合 - 子文档字段

在 Presto 中,如何检查我通过子查询获取的列表中是不是存在数组中的元素