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

时间:2017-03-23 15:08:12

标签: mongodb mongoose aggregation-framework

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

以下是我的尝试:

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

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

3 个答案:

答案 0 :(得分:1)

您是否尝试过此版本的条件:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

{"$lte": [$otherField, null]}