mongodbで日付/時刻を保存する最良の方法


177

文字列、整数のタイムスタンプ、mongoの日時オブジェクトを使用するのを見てきました。

回答:


200

最良の方法は、BSONネイティブDateオブジェクトにマップするネイティブJavaScript 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タイムスタンプは秒単位で測定されます。JavaScript Dateオブジェクトは、Unixエポックからのミリ秒単位で測定されます


9
それはどのようにDBに保存されますか?mongo datetimeオブジェクトとして?
Thilo

2
@チロ:私が知る限り、MongoDBには特別な「日時」オブジェクトはありません。BSONフォームに格納されているJavaScriptの日付タイプを使用します。
Niels van der Rest

1
@Thilo:正解です。これは基本的に、JavaScript日付オブジェクトのBSON表現です。これは、64ビット整数で、Unixエポックからのミリ秒を格納し、JavaScript仕様のメソッドの(ほとんど?)をサポートしています
Niels van der Rest

1
@AboozarRajabi 389and 240はタイムスタンプのミリ秒です。Zの文字列の形式は、指定したタイムスタンプがUTCであることにMongoDBを伝えます。その後、それを読み返すと、アプリケーションによっておそらくローカルタイムゾーンに変換され、時間が変更されたように見えます。しかし、時間は同じです。異なるタイムゾーンの観点からのみ解釈されます。たとえば、同じ瞬間12:50:42Z13:50:42+01:00表します。
Niels van der Rest

5
@AboozarRajabi一般的に、初期入力が正しい限り、どのように格納されるかを気にする必要はありません。それがある場合は21:56:03+01:00CETに今、あなたが挿入しnew Date()、その後、MongoDBはあります表すように20:56:03Z。しかし、それを読み返して、ローカルタイムゾーン設定(CET)を使用してアプリケーションに表示すると、21:56:03再度読み取られます。
Niels van der Rest

53

挿入時刻を表す1つの日付スタンプがすでに_idオブジェクトにあります

したがって、挿入時間が必要な場合は、すでにそこにあります。

mongodbシェルにログインします

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
データベースが本当に高速で、2つのドキュメントが同じミリ秒に格納されている場合、それらのドキュメントは同じ_idですか?
Redsandro

10
@Redsandroいいえ、ただし同じ結果になる可能性があり_id.getTimestamp()ます。
kmiyashiro

@kmiyashiro、そのタイムスタンプに基づいてソートする方法を知っていますか?
ledlogic

1
気にしないで、sort({createdOn:-1); stackoverflow.com/questions/28599237/…
ledlogic
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.