170 votes

Puis-je interroger l'ObjectId de MongoDB par date ?

Je sais que les ObjectIds contiennent la date à laquelle ils ont été créés. Existe-t-il un moyen d'interroger cet aspect de l'ObjectId ?

1 votes

J'ai trouvé ma solution sur steveridout.github.io/mongo-object-time

244voto

Leftium Points 4453

Transformer les timestamps en ObjectIds couvre de manière très détaillée les requêtes basées sur les dates incorporées dans l'ObjectId.

Brièvement en code JavaScript :

/* This function returns an ObjectId embedded with a given datetime */
/* Accepts both Date object and string input */

function objectIdWithTimestamp(timestamp) {
    /* Convert string date to Date object (otherwise assume timestamp is a date) */
    if (typeof(timestamp) == 'string') {
        timestamp = new Date(timestamp);
    }

    /* Convert date object to hex seconds since Unix epoch */
    var hexSeconds = Math.floor(timestamp/1000).toString(16);

    /* Create an ObjectId with that hex timestamp */
    var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");

    return constructedObjectId
}

/* Find all documents created after midnight on May 25th, 1980 */
db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } });

32 votes

Très pratique Pour info, vous pouvez sauvegarder cette fonction dans vos ~/.mongorc.js pour qu'il soit disponible lorsque le mongo Le shell démarre.

1 votes

J'obtiens ReferenceError : ObjectId n'est pas défini. Comment puis-je corriger cela ?

3 votes

J'utilise nodejs avec mongodbnative. J'ai corrigé l'erreur "not defined error" en incluant var ObjectID = require('mongodb').ObjectID ;

45voto

radtek Points 506

Sur pymongo il peut être fait de cette façon :

import datetime
from bson.objectid import ObjectId
mins = 15
gen_time = datetime.datetime.today() - datetime.timedelta(mins=mins) 
dummy_id = ObjectId.from_datetime(gen_time)
result = list(db.coll.find({"_id": {"$gte": dummy_id}}))

1 votes

Notez que l'utilisation de datetime.datetime.utcnow() ou datetime.datetime.today() renvoie le même résultat. La date est gérée pour vous.

0 votes

Alternativement, sans utiliser pymongo dépendance : epoch_time_hex = format(int(time.time()), 'x') (n'oubliez pas d'ajouter des zéros pour votre requête) L'heure à laquelle le paquet a été utilisé ( import time ).

0 votes

Je réalise que l'OP demandait du javascript, mais cela m'a vraiment aidé à simplifier mon code. Merci.

41voto

jksdua Points 138

L'utilisation de la fonction intégrée fournie par les pilotes mongodb dans Node.js vous permet d'effectuer des requêtes sur n'importe quel horodatage :

var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);

Par ailleurs, pour rechercher des enregistrements antérieurs à l'heure actuelle, vous pouvez simplement faire :

var objectId = new ObjectID(); // or ObjectId in the mongo shell

Source : http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html

3 votes

C'est la meilleure/la plus simple façon de créer un ObjectId à partir d'un timestamp dans un environnement javascript. Ce qui est ce que l'op demande...

16voto

ash Points 6462

Puisque les 4 premiers octets d'un ObjectId représente un horodatage pour interroger votre collection de manière chronologique, il suffit de la classer par identifiant :

# oldest first; use pymongo.DESCENDING for most recent first
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)

Après avoir obtenu les documents, vous pouvez obtenir les ObjectId's temps de génération comme ça :

id = some_object_id
generation_time = id.generation_time

1 votes

J'espérais quelque chose qui permettrait de faire des choses comme obtenir un compte des objets créés avant un certain temps en utilisant l'heure intégrée dans l'ObjectId, mais il semble que cela ne soit pas directement accessible. Merci.

1 votes

Vous pouvez le faire, regardez la réponse de Leftium.

4voto

Gianluca Points 1204

Dans la documentation :

o = new ObjectId()
date = o.getTimestamp()

de cette façon, vous avez une date qui est une ISODate.

Regardez http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extraire les temps d'insertion de l'identifiant plutôt que d'avoir un champ d'horodatage séparé. . pour plus d'informations

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