例如,我将这个JSON注入

{
    "insert": "2023-12-08T09:49:00"
}

它是串的

我在这里发送了这个问题

db.example.find({ "insert" : { "$gt" : "2023-12-08T09:48:00.000Z", "$lt" : "2023-12-08T10:23:38" } })

它怎么可能起作用呢?我在文档中找不到任何从字符串到UTC日期的隐式转换.

我知道这一领域一定是最佳实践的日期,但这让我好奇是否有任何类型的解释.

推荐答案

它之所以有效,是因为它在两个字符串之间进行字符串比较.日期采用UTC-ISO格式的众多优点之一是:YYYY-MM-DDTHH:MM:SSZ.当然,对于日期不建议这样做,因为字符串比较比日期时间比较慢得多,因为它们实际上是数字(浮点).

因此,组成日期bigger的部分位于左侧,并且与字符串比较很好地融合在一起.

例如:与"aaa"<;"bbb"一样,"2022"<;"2023"也是如此.这只是一个字一个字的比较.

字符串"2023-12-08T09:49:00"小于字符串"2023-12-08T10:23:38"-在每个字符串中,从左到右,它们等于0<;1.只是对人类来说,它看起来也像是一种有意义的日期格式.

出现问题的地方是,如果您试图比较不同时区的日期时间,那么它只会被视为一个字符串,它不会正确工作.

DateTime 2023-12-08T09:49:00+0800>;2023-12-08T10:23:38+0100(注意+/-之后指定的时区).但是作为字符串,它会说第一个<;第二个,因为没有从时区规范中提取meaning或实际值.

顺便说一句,当存储为字符串时,ISO格式日期的这种行为几乎出现在all programming languages次,因为这只是字符串比较.(想不出字符串的行为不是这样的.)


顺便说一句,如果您的文档将其作为real date,而不是看起来像日期的字符串,则它将具有$date部分,并且在Mongo中始终为UTC:

{
  "insert": {
    "$date": "2023-12-08T09:49:00.000Z"
  }
}

Mongodb相关问答推荐

对对象数组进行分组并在 mongodb 中获取计数

如何 db.getUser() 使用 go mongo-driver

MongoDB shell:如何删除列表以外的所有集合

从 MongoDB 中的聚合结果中获取不同的值

使用 $addFields 将字段添加到 $lookup 结果中的每个项目

MongoDB - 文档中多个数组大小的总和

以聚合顺序使用 $$ROOT

如何将 json 字符串编组到 bson 文档以写入 MongoDB?

指定字段对于 MongoDB 是transient瞬态的,但对于 RestController 不是

你如何在 Kubernetes 上设置 Mongo 副本集?

如何在 MongoDB 中进行内部连接?

嵌套在文档数组中的mongodb展开数组

什么是 mongodb 中的admin数据库?

Mongoose.js 通过一个 connect() 调用创建到 MongoDB 的多个连接

java.lang.IncompatibleClassChangeError:Implementing class Mongo

我如何使用 Twitter 的流 api 中的推文并将它们存储在 mongodb 中

有人在 Google App Engine 上try 过 MongoDB 吗?

通过 Java 执行 Mongo like Query (JSON)

对于社交网站(使用 Ruby on Rails 开发)来说,MongoDB 会是一个好主意吗?

用于 MongoDB 的 Node.js 模块