Найкращий спосіб зберігати дату / час у mongodb


177

Я бачив, використовуючи рядки, цілі часові позначки та об’єкти дати монго.

Відповіді:


200

Найкращий спосіб - це зберігання нативних об’єктів дати JavaScript , які відображають на 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") }

Рідний тип підтримує цілий ряд корисних методів поза рамками, які ви можете використовувати, наприклад, у ваших завданнях для зменшення карти.

Якщо вам потрібно, ви можете легко перетворити Dateоб'єкти в часові позначки Unix та з них 1) , використовуючи відповідно getTime()метод та Date(milliseconds)конструктор.

1) Строго кажучи, часова мітка Unix вимірюється в секундах . Об'єкт JavaScript Дата вимірюється в мілісекундах з епохи Unix.


9
Як це буде зберігатися в БД? Як об’єкт дати монго?
Тіло,

2
@Thilo: Наскільки мені відомо, у MongoDB немає спеціального об'єкта «дата». Він використовує тип дати JavaScript, який зберігається у формі BSON.
Niels van der Rest

1
@Thilo: Правильно, це в основному представлення BSON об’єкта Date JavaScript. Це 64-бітове ціле число, яке зберігає мілісекунди з часів Unix і підтримує (більшість?) Методів із специфікації JavaScript .
Niels van der Rest

1
@AboozarRajabi Мікросекунди часової позначки - це 389і 240є. ZУ форматі рядки говорить MongoDB , що мітка часу Наданий в UTC. Якщо потім ви прочитаєте його назад, ваша програма, ймовірно, перетворить його у ваш локальний часовий пояс, завдяки чому здається, що час змінився. Але час все одно той самий, його трактують лише з іншого погляду часового поясу. Наприклад 12:50:42Zі 13:50:42+01:00представляють той самий момент у часі.
Niels van der Rest

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

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
Але це часова мітка, коли документ був збережений у db, іноді потрібно зберігати дати та часи, не пов’язані з датою вставки.
Ювал А.

1
Якщо ваша база даних дійсно швидка і два документи зберігаються в одній мілісекунді .. чи ці документи однакові _id?
Редсандро

10
@Redsandro ні, але потенційно вони можуть мати той же результат _id.getTimestamp().
kmiyashiro

@kmiyashiro, чи трапляється ви знати, як сортувати на основі цієї часової позначки?
ledlogic

1
Nevermind, sort ({createdOn: -1); є підхід до використання з stackoverflow.com/questions/28599237 / ...
ledlogic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.