在 MongoDB 聚合中用 $cond 替换 $ifNull

Replacing $ifNull with $cond in MongoDB aggregation

我正在考虑将我的应用程序从 MongoDB 3.6 迁移到 AWS DocumentDB。我正在检查是否支持所有内容,我在代码中发现了 $ifNull(聚合)。 DocumentDB 不支持 $ifNull.

对于样本文档集:

[
  { "hostname": "foo", "name": "a", "is_valid": true },
  { "hostname": "foo", "name": "b", "is_valid": false },
  { "hostname": "foo", "name": "c" }
]

我想按主机名字段对文档进行分组,如果 is_valid 字段不存在,请将其设置为真。这是当前聚合查询:

{
  $group: {
    _id: "$hostname",
    boxes: {
      $push: {
        name: "$name",
        is_valid: { $ifNull: ["$is_valid", true]}
      }
    }
  }
}

它returns:

{
  "_id": "foo",
  "boxes": [
    { "name": "a", "is_valid": true },
    { "name": "b", "is_valid": false },
    { "name": "c", "is_valid": true }
  ]
}

这是我试过的:

{
  $group: {
    _id: "$hostname",
    boxes: {
      $push: {
        name: "$name",
        is_valid: { $cond: [{$ne: ["$is_valid", null]}, "$is_valid", true]}
      }
    }
  }
}

但是 returns:

{
  "_id": "foo",
  "boxes": [
    { "name": "a", "is_valid": true },
    { "name": "b", "is_valid": false },
    { "name": "c" }
  ]
}

如何将 $ifNull 翻译成等价的 $cond

$ne 更改为 $gt 有效。

{ 
  $group: {
    _id: "$hostname",
    boxes: {
      $push: {
        name: "$name",
        is_valid: { $cond: [{$gt: ["$is_valid", null]}, "$is_valid", true]}
      }
    }
  }
}

如果有人知道为什么会这样,我会更好地理解它。

Amazon DocumentDB 于 2021 年 1 月添加了对 $ifNull 的支持。