Лучший способ сохранить дату / время в mongodb

177

Я видел использование строк, целочисленных временных меток и объектов времени и монго.

xrado
источник

Ответы:

201

Лучший способ - хранить нативные объекты 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") }

Собственный тип поддерживает целый ряд полезных методов из коробки, которые вы можете использовать, например, в заданиях на уменьшение карты.

Если вам нужно, вы можете легко конвертировать Dateобъекты в метки времени Unix и из них 1) , используя getTime()метод и Date(milliseconds)конструктор соответственно.

1) Строго говоря, метка времени Unix измеряется в секундах . Объект JavaScript Date измеряется в миллисекундах с начала эпохи Unix.

Нильс ван дер Рест
источник
9
Как это будет храниться в БД? Как объект даты и времени Монго?
Тило
2
@Thilo: Насколько я знаю, у MongoDB нет специального объекта datetime. Он использует тип даты JavaScript, который хранится в форме BSON.
Нильс ван дер Рест
1
@Thilo: Правильно, это в основном представление BSON объекта Date в JavaScript. Это 64-разрядное целое число, которое хранит миллисекунды с эпохи Unix и поддерживает (большинство?) Методов из спецификации JavaScript .
Нильс ван дер Рест
1
@AboozarRajabi 389и 240- это миллисекунды метки времени. ZВ формате строки говорит MongoDB , что метка времени Предоставленный в UTC. Если вы затем прочитаете его обратно, ваше приложение, вероятно, преобразует его в местный часовой пояс, создавая впечатление, что время изменилось. Но время все равно, оно интерпретируется только с другой точки зрения. Например 12:50:42Zи 13:50:42+01:00представлять один и тот же момент времени.
Нильс ван дер Рест
5
@AboozarRajabi В общем, вы не хотите беспокоиться о том, как он хранится, если исходный ввод верен. Если это 21:56:03+01:00прямо сейчас в CET и вы вставляете new Date(), то MongoDB может представлять его как 20:56:03Z. Но когда вы прочитаете его обратно и отобразите в своем приложении, используя настройки локального часового пояса (CET), оно будет прочитано 21:56:03снова.
Нильс ван дер Рест
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" }

Получить каждую строку в формате гггг-мм-дд чч: мм: сс:

> 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

Эрик Лещинский
источник
19
Но это отметка времени, когда документ был сохранен в БД, иногда вы хотите сохранить даты и время, не связанные с датой вставки.
Ювал А.
1
Если ваша база данных очень быстрая и два документа хранятся в одну и ту же миллисекунду ... у них одинаковые документы _id?
Redsandro
10
@Redsandro нет, но потенциально они могут иметь такой же результат _id.getTimestamp().
Киясиро
@kmiyashiro, вы случайно не знаете, как сортировать по этой отметке времени?
ledlogic
1
Неважно, сортировка ({madeOn: -1); это подход к использованию от stackoverflow.com/questions/28599237/…
ledlogic