Il modo migliore per memorizzare data / ora in mongodb


177

Ho visto usare stringhe, timestamp interi e oggetti mongo datetime.

Risposte:


201

Il modo migliore è archiviare oggetti Date nativi JavaScript , che vengono mappati su oggetti Date nativi 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") }

Il tipo nativo supporta un'intera gamma di metodi utili pronti all'uso, che è possibile utilizzare, ad esempio, nei lavori di riduzione delle mappe.

Se necessario, è possibile convertire facilmente gli Dateoggetti da e verso i timestamp Unix 1) , utilizzando rispettivamente il getTime()metodo e il Date(milliseconds)costruttore.

1) A rigor di termini, il timestamp Unix viene misurato in secondi . L'oggetto JavaScript Date misura in millisecondi dall'epoca di Unix.


9
Come verrà archiviato nel DB? Come oggetto mongo datetime?
Thilo,

2
@Thilo: MongoDB non ha oggetti speciali "datetime" per quanto ne so. Utilizza il tipo di data JavaScript, che viene archiviato nel modulo BSON.
Niels van der Rest

1
@Thilo: esatto, questa è sostanzialmente la rappresentazione BSON di un oggetto JavaScript Date. È un numero intero a 64 bit che memorizza i millisecondi dall'epoca di Unix e supporta (la maggior parte?) Dei metodi dalla specifica JavaScript .
Niels van der Rest,

1
@AboozarRajabi Il 389e 240sono i millisecondi del timestamp. L' Znel formato di stringa dice MongoDB che il timestamp che hai fornito è in UTC. Se poi lo rileggi, l'applicazione probabilmente lo converte nel fuso orario locale , facendo sembrare che l'ora sia cambiata. Ma il tempo è sempre lo stesso, è interpretato solo da una diversa prospettiva del fuso orario. Ad esempio 12:50:42Ze 13:50:42+01:00rappresentano lo stesso momento nel tempo.
Niels van der Rest

5
@AboozarRajabi In generale non vuoi preoccuparti di come viene archiviato, purché l'input iniziale sia corretto. Se è 21:56:03+01:00ora in CET e si inserisce new Date(), allora MongoDB potrebbe rappresentarlo come 20:56:03Z. Ma quando lo rileggi e lo visualizzi nella tua applicazione utilizzando le impostazioni locali del fuso orario (CET), verrà letto di 21:56:03nuovo.
Niels van der Rest

53

Un datestamp è già nell'oggetto _id, che rappresenta il tempo di inserimento

Quindi, se il tempo di inserimento è quello che ti serve, è già lì:

Accedi alla shell 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

Crea il tuo database inserendo elementi

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

Consente di rendere quel database quello su cui ci troviamo ora

> use penguins
switched to db penguins

Ripristina le righe:

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

Ottieni ogni riga nel formato aaaa-MM-gg 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 l'ultimo one-liner ti confonde, ho una procedura dettagliata su come funziona qui: https://stackoverflow.com/a/27613766/445131


19
Ma è il timestamp per quando il documento è stato salvato nel db, a volte si desidera memorizzare date e orari non correlati alla data di inserimento.
Yuval A.

1
Se il tuo database è veramente veloce e due documenti sono archiviati nello stesso millisecondo .. quei documenti hanno lo stesso _id?
Redsandro,

10
@Redsandro no, ma potenzialmente potrebbero avere lo stesso risultato di _id.getTimestamp().
kmiyashiro,

@kmiyashiro, ti capita di sapere come ordinare in base a quel timestamp?
ledlogic,

1
Nevermind, sort ({CreatedOn: -1); è l'approccio da utilizzare dal stackoverflow.com/questions/28599237/...
ledlogic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.