ChatGPT解决这个技术问题 Extra ChatGPT

在 mongodb 中存储日期/时间的最佳方法

我见过使用字符串、整数时间戳和 mongo datetime 对象。


D
Dan Dascalescu

最好的方法是存储映射到 BSON native Date objects 的原生 JavaScript Date objects

> db.test.insert({date: ISODate()})
> db.test.insert({date: new Date()})
> db.test.find()
{ "_id" : ObjectId("..."), "date" : ISODate("2014-02-10T10:50:42.389Z") }
{ "_id" : ObjectId("..."), "date" : ISODate("2014-02-10T10:50:57.240Z") }

native 类型支持一系列开箱即用的有用方法,例如,您可以在 map-reduce 作业中使用这些方法。

如果需要,您可以分别使用 getTime() 方法和 Date(milliseconds) 构造函数轻松地将 Date 对象与 Unix 时间戳1) 相互转换。

1) 严格来说,Unix 时间戳是以秒为单位的。 JavaScript Date 对象以 Unix 纪元以来的毫秒数为单位。


它将如何存储在数据库中?作为 mongo 日期时间对象?
@Thilo:据我所知,MongoDB 没有特殊的“日期时间”对象。它使用 JavaScript Date 类型,以 BSON 形式存储。
@Thilo:正确,这基本上是 JavaScript Date 对象的 BSON 表示。它是一个 64 位整数,用于存储自 Unix 纪元以来的毫秒数,并支持(大多数?)来自 JavaScript specification 的方法。
@AboozarRajabi 389240 是时间戳的毫秒数。 string format 中的 Z 告诉 MongoDB 您提供的时间戳采用 UTC。如果您随后将其读回,您的应用程序可能会将其转换为您的 local 时区,从而看起来时间已更改。但是时间还是一样的,只是从不同的时区角度来解读。例如 12:50:42Z13:50:42+01:00 表示同一时间点。
@AboozarRajabi 通常,只要初始输入正确,您就不想关心 如何 存储它。如果它现在在 CET 中是 21:56:03+01:00 并且您插入 new Date(),那么 MongoDB 可能会将其表示20:56:03Z。但是,当您读回它并使用本地时区设置 (CET) 在应用程序中显示它时,它会再次读取 21:56:03
E
Eric Leschinski

_id 对象中已经有一个时间戳,代表插入时间

因此,如果插入时间是您所需要的,它已经存在:

登录到 mongodb shell

ubuntu@ip-10-0-1-223:~$ mongo 10.0.1.223
MongoDB shell version: 2.4.9
connecting to: 10.0.1.223/test

通过插入项目创建数据库

> db.penguins.insert({"penguin": "skipper"})
> db.penguins.insert({"penguin": "kowalski"})
> 

让我们现在使用该数据库

> use penguins
switched to db penguins

取回行:

> db.penguins.find()
{ "_id" : ObjectId("5498da1bf83a61f58ef6c6d5"), "penguin" : "skipper" }
{ "_id" : ObjectId("5498da28f83a61f58ef6c6d6"), "penguin" : "kowalski" }

以 yyyy-MM-dd HH:mm:ss 格式获取每一行:

> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds()) })
2014-12-23 3:4:41
2014-12-23 3:4:53

如果最后一条线让您感到困惑,我将在此处提供有关其工作原理的演练:https://stackoverflow.com/a/27613766/445131


但它是文档保存在数据库中的时间戳,有时您希望存储与插入日期无关的日期和时间。
如果您的数据库非常快并且两个文档在同一毫秒内存储......这些文档是否具有相同的 _id
@Redsandro 不,但他们可能会得到与 _id.getTimestamp() 相同的结果。
@kmiyashiro,您是否碰巧知道如何根据该时间戳进行排序?
没关系,排序({createdOn:-1);是从 stackoverflow.com/questions/28599237/… 使用的方法
H
Hossein Kalbasi

我想当您使用 pymongo 时,MongoDB 会将本机 Python datetime 对象存储为 Date 字段。 MongoDB 中的这个 Date 字段可以方便以后进行与日期相关的查询(例如查询间隔)。因此,这样的代码可以在 Python 中运行

from datetime import datetime

datetime_now = datetime.utcnow()
new_doc = db.content.insert_one({"updated": datetime_now})

在此之后,我可以在我的数据库中看到如下所示的字段(我正在使用 Mongo Compass 来查看我的数据库)。请注意它如何不存储为字符串(无引号),并将 Date 显示为字段类型。

https://i.stack.imgur.com/rXl8X.png

关于javascript的使用,这也应该在那里工作。只要您在日期结束时有 +00:00(在我的情况下为 UTC)或 Z,Javascript 就应该能够使用时区信息正确读取日期。


D
Dror

使用下面的代码创建可以在文档中分配的日期时间变量(请注意,我创建的是日期时间对象,而不是日期对象):

from datetime import date
from datetime import datetime
import random

def random(date):
    my_year=random.randint(2020,2022)
    my_month=random.randint(1,12)
    my_day=random.randint(1,28)

    selected=datetime(year = my_year, month = my_month, day = my_day, hour = 0, minute = 0, second = 0)


def insert_objects(collection):

      collection.insert_one( { "mydate": random_date() })