67 votes

Obtenir un horodatage à partir d'un identifiant mongodb

Comment obtenir l'horodatage à partir de l'identifiant MongoDB ?

1 votes

Juste pour info, la deuxième réponse devrait probablement être la réponse acceptée. Elle est implémentée dans tout pilote JS qui utilise le pilote JS natif de MongoDB (c'est-à-dire tous ceux que je connais).

0 votes

Je ne suis pas d'accord avec Dropped.on.Caprica, la réponse acceptée ne nécessite pas d'avoir une bibliothèque pour obtenir la date, donc pour moi c'est mieux.

2 votes

Dans mon cas, j'ai dû faire l'analyse de l'horodatage côté client, et non pas là où se trouve le pilote JS pour MongoDB, donc pour moi aussi la réponse actuellement acceptée est la meilleure. Mais il est bon de connaître les *. getTimestamp aussi, donc +1 aux deux :)

129voto

Kolja Points 762

L'horodatage est contenu dans les 4 premiers octets d'un identifiant mongoDB (voir : http://www.mongodb.org/display/DOCS/Object+IDs ).

Donc votre horodatage est :

timestamp = _id.toString().substring(0,8)

y

date = new Date( parseInt( timestamp, 16 ) * 1000 )

67voto

Chris Lynch Points 301

Depuis Mongo 2.2, cela a changé (voir : http://docs.mongodb.org/manual/core/object-id/ )

Vous pouvez faire tout cela en une seule étape à l'intérieur du shell mongo :

document._id.getTimestamp();

Ceci renverra un objet Date.

2 votes

Aussi python : document_id.generation_time

0 votes

Et PHP $doc['_id']->getTimestamp();

0 votes

Ceci n'est pas plus pertinent, car le PO n'a pas spécifié l'environnement. Dans un environnement JS simple, sans bibliothèques et avec une simple chaîne hexadécimale, la réponse de Kolja est plus utile. Les deux réponses sont bonnes.

38voto

Eric Leschinski Points 14289

Obtenir l'horodatage d'un élément de collection mongoDB, avec explication :

Le timestamp est enterré profondément dans les entrailles de l'objet mongodb.

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"})
> 

Vérifiez si elle est là :

> show dbs
local      0.078125GB
penguins   0.203125GB

Faisons en sorte que cette base de données soit celle sur laquelle nous sommes maintenant.

> use penguins
switched to db penguins

Trouvez-vous un ISODate :

> ISODate("2013-03-01")
ISODate("2013-03-01T00:00:00Z")

Imprimez du json :

> printjson({"foo":"bar"})
{ "foo" : "bar" }

Récupérez les rangs :

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

Nous voulons seulement inspecter une ligne

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

Obtenez l'_id de cette ligne :

> db.penguins.findOne()._id
ObjectId("5498da1bf83a61f58ef6c6d5")

Obtenir l'horodatage de l'objet _id :

> db.penguins.findOne()._id.getTimestamp()
ISODate("2014-12-23T02:57:31Z")

Obtenez l'horodatage du dernier enregistrement ajouté :

> db.penguins.find().sort({_id:-1}).limit(1).forEach(function (doc){ print(doc._id.getTimestamp()) })
Tue Dec 23 2014 03:04:53 GMT+0000 (UTC)

Exemple de boucle, impression de chaînes de caractères :

> db.penguins.find().forEach(function (doc){ print("hi") })
hi
hi

Exemple de boucle, même chose que find(), imprimer les lignes

> db.penguins.find().forEach(function (doc){ printjson(doc) })
{ "_id" : ObjectId("5498dbc9f83a61f58ef6c6d7"), "penguin" : "skipper" }
{ "_id" : ObjectId("5498dbd5f83a61f58ef6c6d8"), "penguin" : "kowalski" }

Bouclez, obtenez la date du système :

> db.penguins.find().forEach(function (doc){ doc["timestamp_field"] = new Date(); printjson(doc); })
{
        "_id" : ObjectId("5498dbc9f83a61f58ef6c6d7"),
        "penguin" : "skipper",
        "timestamp_field" : ISODate("2014-12-23T03:15:56.257Z")
}
{
        "_id" : ObjectId("5498dbd5f83a61f58ef6c6d8"),
        "penguin" : "kowalski",
        "timestamp_field" : ISODate("2014-12-23T03:15:56.258Z")
}

Boucle, récupère la date de chaque ligne :

> db.penguins.find().forEach(function (doc){ doc["timestamp_field"] = doc._id.getTimestamp(); printjson(doc); })
{
        "_id" : ObjectId("5498dbc9f83a61f58ef6c6d7"),
        "penguin" : "skipper",
        "timestamp_field" : ISODate("2014-12-23T03:04:41Z")
}
{
        "_id" : ObjectId("5498dbd5f83a61f58ef6c6d8"),
        "penguin" : "kowalski",
        "timestamp_field" : ISODate("2014-12-23T03:04:53Z")
}

Filtrer uniquement les dates

> db.penguins.find().forEach(function (doc){ doc["timestamp_field"] = doc._id.getTimestamp(); printjson(doc["timestamp_field"]); })
ISODate("2014-12-23T03:04:41Z")
ISODate("2014-12-23T03:04:53Z")

Filtrez davantage pour les cordes seulement :

> db.penguins.find().forEach(function (doc){ doc["timestamp_field"] = doc._id.getTimestamp(); print(doc["timestamp_field"]) })
Tue Dec 23 2014 03:04:41 GMT+0000 (UTC)
Tue Dec 23 2014 03:04:53 GMT+0000 (UTC)

Imprimer une date nue, obtenir son type, attribuer une date :

> print(new Date())
Tue Dec 23 2014 03:30:49 GMT+0000 (UTC)
> typeof new Date()
object
> new Date("11/21/2012");
ISODate("2012-11-21T00:00:00Z")

Convertir l'instance de la date en yyyy-MM-dd

> print(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate())
2014-1-1

l'obtenir au format aaaa-MM-jj pour chaque ligne :

> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()) })
2014-12-23
2014-12-23

le toLocaleDateString est plus court :

> db.penguins.find().forEach(function (doc){ d = doc._id.getTimestamp(); print(d.toLocaleDateString()) })
Tuesday, December 23, 2014
Tuesday, December 23, 2014

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

Obtenez la date de la dernière ligne ajoutée :

> db.penguins.find().sort({_id:-1}).limit(1).forEach(function (doc){ print(doc._id.getTimestamp()) })
Tue Dec 23 2014 03:04:53 GMT+0000 (UTC)

Laissez tomber la base de données lorsque vous avez terminé :

> use penguins
switched to db penguins
> db.dropDatabase()
{ "dropped" : "penguins", "ok" : 1 }

Assurez-vous que c'est parti :

> show dbs
local   0.078125GB
test    (empty)

Votre MongoDB est maintenant à l'échelle du Web.

7voto

webmaster Points 63

Voici une fonction php rapide pour vous tous ;)

public static function makeDate($mongoId) {

    $timestamp = intval(substr($mongoId, 0, 8), 16);

    $datum = (new DateTime())->setTimestamp($timestamp);

    return $datum->format('d/m/Y');
}

0 votes

Comment puis-je faire cela dans spring boot

5voto

poke19962008 Points 634

Dans le côté serveur faire _id de MongoDB ObjectId

date = new Date( parseInt( _id.toString().substring(0,8), 16 ) * 1000 )

Et sur le côté client utiliser

var dateFromObjectId = function (objectId) {
return new Date(parseInt(objectId.substring(0, 8), 16) * 1000);
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X