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


Answers:


199

最好的方法是存储本机JavaScript Date对象,该对象映射到BSON本机Date对象

> 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") }

本机类型开箱即用地支持各种有用的方法,例如,您可以在您的map-reduce作业中使用它们。

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

1)严格来说,Unix时间戳以秒为单位。自从Unix时代以来,JavaScript Date对象以毫秒为单位


9
它将如何存储在数据库中?作为mongo日期时间对象?
Thilo 2010年

2
@Thilo:据我所知,MongoDB没有特殊的“ datetime”对象。它使用JavaScript日期类型,该类型以BSON形式存储。
Niels van der Rest

1
@Thilo:正确,基本上是JavaScript Date对象的BSON表示。它是一个64位整数,存储从Unix纪元以来的毫秒数,并支持JavaScript规范中的方法(最多?)。
尼尔斯·范德·雷斯特

1
@ 389和AboozarRajabi 和240是时间戳的毫秒数。将Z字符串格式告诉MongoDB的您提供的时间戳为UTC。如果您随后将其读回,则您的应用程序可能会将其转换为本地时区,从而使时间似乎已更改。但是时间仍然是相同的,只是从不同时区的角度来解释。例如12:50:42Z13:50:42+01:00代表同一时间。
尼尔斯·范德雷斯特

5
@AboozarRajabi一般来说,你不想去关注如何被存储,只要初始输入是正确的。如果21:56:03+01:00现在在CET中插入了new Date(),那么MongoDB可能表示20:56:03Z。但是,当您读回它并使用本地时区设置(CET)将其显示在应用程序中时,它将21:56:03再次读取。
Niels van der Rest

53

_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


18
但这是文档保存在数据库中的时间戳,有时您想存储与插入日期无关的日期和时间。
Yuval A.

1
如果您的数据库速度非常快,并且两个文档在同一毫秒内存储..这些文档具有相同的内容_id吗?
雷德桑德罗(Redsandro)

10
@Redsandro否,但可能他们会有相同的结果_id.getTimestamp()
kmiyashiro 2015年

@kmiyashiro,您是否会知道如何根据该时间戳进行排序?
ledlogic

1
没关系,排序({createdOn:-1); 是从stackoverflow.com/questions/28599237/…
ledlogic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.