MongoDB 使用 $convert 将一个数值转换为日期后,转换异常无效,返回的 NaN, mongo中应如何处理?

在mongodb 4.4中,遇到一个奇怪的事情,在mongodb中使用 $convert 将一个double 值转换为 date 类型时,值为负数的时候存在onError未生效的情况
-202636829548800000 ,onError 未生效,
-39176725729017600000 ,onError 生效

尝试在$convert中使用 $ifNull,但是当先将字段查询处理,再对字段值 NaN 进行转换时又可以检测到$convert onNull 生效

遇到这种情况,应如何区处理这个 NaN 值

查询示例

aggregate([
  {
    "$addFields": {
      "testNumber1_default": {
            "$convert": {
              "input": {
                "$subtract": [
                  {
                    "$add": [NumberLong("1708617600000"),2*24*60*60000
                    ]
                  },
                  {
                    "$multiply": [2345353453,24*60*60000]
                  }
                ]
              },
              "to": "date",
              "onError": null,
              "onNull": null,
            }
      },
      "testNumber1_double": {
        "$convert": {
          "input": {
            "$subtract": [
              {
                "$add": [Double("1708617600000"),2*24*60*60000
                ]
              },
              {
                "$multiply": [2345353453,24*60*60000]
              }
            ]
          },
          "to": "double",
          "onError": null,
          "onNull": null
        }
      },
      "testNumber1_date": {
       "$convert": {
          "input": "$testNumber1_double",
          "to": "date",
          "onError": null,
          "onNull": null
        }
      },
      "testNumber2_double": {
       "$convert": {
          "input": {
            "$subtract": [
              {
                "$add": [Double("1708617600000"),2*24*60*60000
                ]
              },
              {
                "$multiply": [453434345345,24*60*60000]
              }
            ]
          },
          "to": "double",
          "onError": null,
          "onNull": null
        }
      },
      "testNumber2_date": {
       "$convert": {
          "input": "$testNumber2_double",
          "to": "date",
          "onError": null,
          "onNull": null
        }
      }
    }
  },
  {
      "$project":{
          "testNumber1_default":1,
          "testNumber1_double":1,
          "testNumber1_date":1,
          "testNumber2_double":1,
          "testNumber2_date":1,
      }
  },
  {
    "$skip": 0
  },
  {
    "$limit": 1
  }
])

查询结果

image.png

转换失败,类型还是doublem,而非null或date
image.png

阅读 1.3k
avatarAI BotBETA

在MongoDB中,当你使用 $convert 操作符将一个数值转换为日期时,遇到 NaN 的情况确实有点复杂。因为 NaN 在 MongoDB 中被视为一个特殊的值,它不能被直接转换为日期。

在你的查询示例中,你尝试使用 $subtract$multiply 操作符来生成一个日期值,但是结果有时候是 NaN。当你将 NaN 值作为 $convert 操作符的输入时,它并不会按照 onErroronNull 指定的方式处理。

为了处理这种情况,你可以尝试以下几种方法:

  1. 使用 $ifNull 操作符: 你可以尝试使用 $ifNull 操作符来处理可能的 NaN 值。例如,你可以先使用 $ifNull 来检查字段值是否为 NaN,如果是,则返回一个特定的值(如 null),然后再进行转换。
{
  "$convert": {
    "input": {
      "$ifNull": ["$yourField", "NaN"]
    },
    "to": "date",
    "onError": null,
    "onNull": null
  }
}
  1. 使用 $where 操作符: 另一种方法是使用 $where 操作符来过滤掉包含 NaN 值的文档。你可以在聚合管道中添加一个 $where 阶段,用于检查字段值是否为 NaN,如果是,则将其排除。
  2. 自定义错误处理: 如果以上方法都不奏效,你可以考虑在应用层处理这种情况。在查询结果返回后,你可以在应用代码中检查字段值是否为 NaN,如果是,则进行相应的处理(如将其替换为特定值或跳过该文档)。

请注意,这些方法可能并不适用于所有情况,具体取决于你的数据和查询需求。在处理 NaN 值时,关键是确保你的查询逻辑能够正确地处理这些异常情况,以避免数据完整性问题或查询结果的不一致性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进