Melhor maneira de armazenar data / hora no mongodb

177

Eu já vi usando strings, timestamps inteiros e objetos de data e hora mongo.

xrado
fonte

Respostas:

200

A melhor maneira é armazenar objetos Date nativos do JavaScript , que são mapeados nos objetos Date nativos do 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") }

O tipo nativo suporta toda uma gama de métodos úteis prontos para uso, que você pode usar nos trabalhos de redução de mapa, por exemplo.

Se necessário, é possível converter facilmente Dateobjetos de e para os registros de data e hora do Unix 1) , usando o getTime()método e o Date(milliseconds)construtor, respectivamente.

1) Estritamente falando, o carimbo de data e hora do Unix é medido em segundos . O objeto Data JavaScript mede em milissegundos desde a época do Unix.

Niels van der Rest
fonte
9
Como isso será armazenado no banco de dados? Como um objeto datetime mongo?
Thilo
2
@Thilo: MongoDB não tem nenhum objeto especial 'datetime', tanto quanto eu sei. Ele usa o tipo Data JavaScript, que é armazenado no formato BSON.
Niels van der Rest
1
@ Thilo: Correto, isso é basicamente a representação BSON de um objeto Data JavaScript. É um número inteiro de 64 bits que armazena os milissegundos desde a época do Unix e suporta (a maioria?) Dos métodos da especificação JavaScript .
Niels van der Rest
1
@AboozarRajabi Os 389e 240são os milissegundos do registro de data e hora. O formatoZ no formato string indica ao MongoDB que o carimbo de data / hora fornecido é no UTC. Se você o ler novamente, seu aplicativo provavelmente o converterá no fuso horário local , fazendo parecer que a hora mudou. Mas o tempo ainda é o mesmo, só é interpretado de uma perspectiva diferente do fuso horário. Por exemplo, 12:50:42Ze 13:50:42+01:00representa o mesmo momento no tempo.
Niels van der Rest
5
@AboozarRajabi Em geral, você não quer se preocupar com o modo como é armazenado, desde que a entrada inicial esteja correta. Se ele está 21:56:03+01:00agora no CET e você o insere new Date(), o MongoDB pode representá- lo como 20:56:03Z. Mas quando você o ler novamente e exibi-lo no seu aplicativo usando as configurações de fuso horário local (CET), ele será lido 21:56:03novamente.
Niels van der Rest
53

Um carimbo de data já está no objeto _id, representando o tempo de inserção

Portanto, se o tempo de inserção é o que você precisa, ele já está lá:

Entre no 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

Crie seu banco de dados inserindo itens

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

Vamos fazer desse banco de dados o que estamos agora

> use penguins
switched to db penguins

Recupere as linhas:

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

Obtenha cada linha no formato aaaa-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

Se esse último one-liner o confundir, tenho uma explicação de como isso funciona aqui: https://stackoverflow.com/a/27613766/445131

Eric Leschinski
fonte
18
Mas é o carimbo de data e hora de quando o documento foi salvo no banco de dados, às vezes você deseja armazenar datas e horários não relacionados à data de inserção.
Yuval A. 27/01
1
Se seu banco de dados é realmente rápido e dois documentos são armazenados no mesmo milissegundo. Esses documentos têm o mesmo _id?
Redsandro # 23/15
10
@Redsandro não, mas potencialmente poderiam ter o mesmo resultado _id.getTimestamp().
kmiyashiro
@kmiyashiro, você saberia como classificar com base nesse carimbo de data e hora?
Ledlogic 28/09/2015
1
Deixa pra lá, ordena ({createdOn: -1); é a abordagem de usar a partir stackoverflow.com/questions/28599237/...
ledlogic