【问题标题】:Replacing $ifNull with $cond in MongoDB aggregation在 MongoDB 聚合中用 $cond 替换 $ifNull
【发布时间】:2020-09-25 03:34:47
【问题描述】:

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

【问题讨论】:

    标签: mongodb aws-documentdb


    【解决方案1】:

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

    【解决方案2】:

    $ne 更改为$gt 有效。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2020-12-30
      • 2019-02-25
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多