首页 > 解决方案 > 在 MongoDB 聚合中用 $cond 替换 $ifNull

问题描述

我正在考虑将我的应用程序从 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]}
      }
    }
  }
}

它返回:

{
  "_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]}
      }
    }
  }
}

但这会返回:

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

我怎样才能翻译$ifNull成等价物$cond

标签: mongodbaws-documentdb

解决方案


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


推荐阅读