当前位置: 首页 > 知识库问答 >
问题:

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

百里弘致
2024-02-24

在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个答案

边意
2024-02-24

在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 值时,关键是确保你的查询逻辑能够正确地处理这些异常情况,以避免数据完整性问题或查询结果的不一致性。

 类似资料:
  • 查询:{“日期”:{“$GTE”:“2021-07-22T03:00:00”,“$LTE”:“2021-07-23T03:00:00”},“isdeleted”:false},字段:{},排序:{} 将字符串转换为数据格式,如下所示,我只得到时间戳 DateFormat originalFormatData=new SimpleDateFormat(“yyyy-mm-dd't'hh:mm:ss”,

  • 问题内容: 我在mySQL 5.1中有一个数据类型的日期列。如何将其转换为DATE? 这是我到目前为止所拥有的- 得到这个 错误-#1064-您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在’FROM 7 FOR 4附近使用) 请帮忙。 问题答案: 您可以使用MySQL的功能 尽管我怀疑您使用Unix时间戳会更轻松

  • 本文向大家介绍MongoDB如何将出生日期记录转换为年龄,包括了MongoDB如何将出生日期记录转换为年龄的使用技巧和注意事项,需要的朋友参考一下 让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是将出生日期转换为年龄的查询- 这将产生以下输出-

  • 问题内容: 我有一个二维的numpy数组。此数组中的一些值为。我想使用此数组执行某些操作。例如考虑数组: 我试图每次取一行,以相反的顺序对其进行排序,以从行中获取最多3个值并取其平均值。我试过的代码是: 这不适用于包含的行。我的问题是,是否有一种快速的方法可以将2D numpy数组中的所有值都转换为零,以便我在排序和其他尝试做的事情上没有问题。 问题答案: 这应该工作: 在上述情况下,where_

  • 问题内容: 因此,我在MongoDB转储中有大量的.bson。我在命令行上使用bsondump,将输出作为stdin传递到python。这可以成功地将BSON转换为“ JSON”,但实际上它是一个字符串,似乎不是合法的JSON。 例如,输入行如下所示: 我相信的是Mongo Extended JSON 。 当我在这样一行中阅读并执行以下操作时: 我得到: 哪一个还是。 我也尝试过 (请参阅pymo

  • 问题内容: 给定一年和一个日历周,我如何获得该周的星期二作为日期? 问题答案: 给定您和(日历周)作为变量(例如,从SELECT语句中获取),您可以通过以下方式获取DATE: 该短语重复;不想存储变量。SQL语句在MySQL上对我来说效果很好。 更新: 只是为了澄清:将产生一周的第一天。从中减去一个数字(星期二为-1;星期三为-2,依此类推,将为您选择一周中的特定日期)。看这里。