最好的方法是存储映射到 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 纪元以来的毫秒数为单位。
_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
?
_id.getTimestamp()
相同的结果。
我想当您使用 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 就应该能够使用时区信息正确读取日期。
使用下面的代码创建可以在文档中分配的日期时间变量(请注意,我创建的是日期时间对象,而不是日期对象):
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() })
389
和240
是时间戳的毫秒数。 string format 中的Z
告诉 MongoDB 您提供的时间戳采用 UTC。如果您随后将其读回,您的应用程序可能会将其转换为您的 local 时区,从而看起来时间已更改。但是时间还是一样的,只是从不同的时区角度来解读。例如12:50:42Z
和13:50:42+01:00
表示同一时间点。21:56:03+01:00
并且您插入new Date()
,那么 MongoDB 可能会将其表示为20:56:03Z
。但是,当您读回它并使用本地时区设置 (CET) 在应用程序中显示它时,它会再次读取21:56:03
。