Cách tốt nhất để lưu trữ ngày / giờ trong mongodb


177

Tôi đã thấy sử dụng các chuỗi, dấu thời gian nguyên và các đối tượng datetime mongo.

Câu trả lời:


200

Cách tốt nhất là lưu trữ các đối tượng Ngày JavaScript gốc , ánh xạ vào các đối tượng Ngày gốc của BSON .

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

Kiểu gốc hỗ trợ toàn bộ một loạt các phương thức hữu ích , ví dụ, bạn có thể sử dụng các công việc giảm bản đồ của mình.

Nếu bạn cần, bạn có thể dễ dàng chuyển đổi Datecác đối tượng sang và từ dấu thời gian Unix 1) , bằng cách sử dụng getTime()phương thức và hàm Date(milliseconds)tạo tương ứng.

1) Nói đúng ra, dấu thời gian Unix được đo bằng giây . Đối tượng Ngày JavaScript đo bằng mili giây kể từ thời kỳ Unix.


9
Làm thế nào điều đó sẽ được lưu trữ trong DB? Là một đối tượng datetime mongo?
Thilo

2
@Thilo: MongoDB không có đối tượng 'datetime' đặc biệt như tôi biết. Nó sử dụng loại Ngày JavaScript, được lưu trữ ở dạng BSON.
Niels van der Nghỉ

1
@Thilo: Chính xác, về cơ bản đó là đại diện BSON của một đối tượng Ngày JavaScript. Đó là số nguyên 64 bit lưu trữ mili giây kể từ thời kỳ Unix và hỗ trợ (hầu hết?) Các phương thức từ đặc tả JavaScript .
Niels van der Nghỉ

1
@AboozarRajabi Các 389240là một phần nghìn giây của dấu thời gian. Các Ztrong định dạng chuỗi kể MongoDB rằng dấu thời gian mà bạn cung cấp là trong giờ UTC. Nếu sau đó bạn đọc lại, ứng dụng của bạn có thể chuyển đổi nó thành múi giờ địa phương của bạn , làm cho nó có vẻ như thời gian đã thay đổi. Nhưng thời gian vẫn vậy, nó chỉ được giải thích từ một góc độ múi giờ khác. Ví dụ 12:50:42Z13:50:42+01:00đại diện cho cùng một thời điểm trong thời gian.
Niels van der Rest

5
@AboozarRajabi Nói chung, bạn không muốn quan tâm đến cách lưu trữ, miễn là đầu vào ban đầu là chính xác. Nếu nó 21:56:03+01:00hiện tại trong CET và bạn chèn new Date(), thì MongoDB có thể đại diện cho nó là 20:56:03Z. Nhưng khi bạn đọc lại và hiển thị nó trong ứng dụng của mình bằng cài đặt múi giờ cục bộ (CET), nó sẽ đọc 21:56:03lại.
Niels van der Rest

53

Một dấu thời gian đã có trong đối tượng _id, biểu thị thời gian chèn

Vì vậy, nếu thời gian chèn là những gì bạn cần, thì nó đã có:

Đăng nhập vào vỏ 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

Tạo cơ sở dữ liệu của bạn bằng cách chèn các mục

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

Hãy làm cho cơ sở dữ liệu đó là cơ sở dữ liệu chúng ta đang có

> use penguins
switched to db penguins

Lấy lại các hàng:

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

Nhận từng hàng ở định dạng 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

Nếu điều đó cuối cùng làm bạn bối rối, tôi có một hướng dẫn về cách hoạt động ở đây: https://stackoverflow.com/a/27613766/445131


18
Nhưng đó là dấu thời gian khi tài liệu được lưu trong db, đôi khi bạn muốn lưu trữ ngày và giờ không liên quan đến ngày chèn.
Yuval A.

1
Nếu cơ sở dữ liệu của bạn thực sự nhanh và hai tài liệu được lưu trữ trong cùng một mili giây .. những tài liệu đó có giống nhau _idkhông?
Redsandro

10
@Redsandro không, nhưng có khả năng họ có thể có kết quả tương tự _id.getTimestamp().
kmiyashiro

@kmiyashiro, bạn có biết cách sắp xếp dựa trên dấu thời gian đó không?
ledlogic

1
Nevermind, sort ({createdOn: -1); là cách tiếp cận để sử dụng từ stackoverflow.com/questions/28599237/ trên
ledlogic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.