Meilleur moyen de stocker la date / l'heure dans Mongodb

177

J'ai vu utiliser des chaînes, des horodatages entiers et des objets mongo datetime.

Xrado
la source

Réponses:

201

Le meilleur moyen est de stocker des objets Date JavaScript natifs , qui correspondent aux objets Date natifs 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") }

Le type natif prend en charge toute une gamme de méthodes utiles prêtes à l'emploi, que vous pouvez utiliser dans vos travaux de réduction de carte, par exemple.

Si vous en avez besoin, vous pouvez facilement convertir des Dateobjets vers et depuis les horodatages Unix 1) , en utilisant respectivement la getTime()méthode et le Date(milliseconds)constructeur.

1) À proprement parler, l'horodatage Unix est mesuré en secondes . L'objet Date JavaScript mesure en millisecondes depuis l'époque Unix.

Niels van der Rest
la source
9
Comment cela sera-t-il stocké dans la base de données? En tant qu'objet datetime mongo?
Thilo
2
@Thilo: MongoDB n'a pas d'objet spécial 'datetime' pour autant que je sache. Il utilise le type de date JavaScript, qui est stocké sous forme BSON.
Niels van der Rest le
1
@Thilo: Correct, c'est essentiellement la représentation BSON d'un objet JavaScript Date. C'est un entier 64 bits qui stocke les millisecondes depuis l'époque Unix et prend en charge (la plupart?) Des méthodes de la spécification JavaScript .
Niels van der Rest le
1
@AboozarRajabi Les 389et 240sont les millisecondes de l'horodatage. Le Zdans le format de la chaîne indique que l'horodatage MongoDB vous avez fourni est en UTC. Si vous le relisez ensuite, votre application le convertit probablement dans votre fuseau horaire local , ce qui donne l'impression que l'heure a changé. Mais l'heure est toujours la même, elle n'est interprétée que dans une perspective de fuseau horaire différente. Par exemple, 12:50:42Zet 13:50:42+01:00représentent le même moment dans le temps.
Niels van der Rest
5
@AboozarRajabi En général, vous ne voulez pas vous soucier de la façon dont il est stocké, tant que l'entrée initiale est correcte. Si c'est 21:56:03+01:00maintenant dans CET et que vous insérez new Date(), alors MongoDB pourrait le représenter comme 20:56:03Z. Mais lorsque vous le relisez et l'affichez dans votre application en utilisant les paramètres de fuseau horaire local (CET), il sera lu à 21:56:03nouveau.
Niels van der Rest
53

Un horodatage est déjà dans l'objet _id, représentant l'heure d'insertion

Donc, si le temps d'insertion est ce dont vous avez besoin, il est déjà là:

Connectez-vous au 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

Créez votre base de données en insérant des éléments

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

Faisons de cette base de données celle sur laquelle nous nous trouvons actuellement

> use penguins
switched to db penguins

Récupérez les lignes:

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

Obtenez chaque ligne au format aaaa-MM-jj 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

Si ce dernier one-liner vous confond, j'ai une procédure pas à pas sur comment cela fonctionne ici: https://stackoverflow.com/a/27613766/445131

Eric Leschinski
la source
19
Mais il s'agit de l'horodatage du moment où le document a été enregistré dans la base de données, parfois vous souhaitez stocker des dates et des heures non liées à la date d'insertion.
Yuval A.
1
Si votre base de données est vraiment rapide et que deux documents sont stockés dans la même milliseconde .. ces documents ont-ils la même chose _id?
Redsandro
10
@Redsandro non, mais ils pourraient potentiellement avoir le même résultat _id.getTimestamp().
kmiyashiro
@kmiyashiro, sauriez-vous comment trier en fonction de cet horodatage?
ledlogic
1
Nevermind, sort ({createdOn: -1); est l'approche à utiliser de stackoverflow.com/questions/28599237/…
ledlogic