javascript nodejs - Puis-je interroger MongoDB ObjectId par date?



to string (9)

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?


Answers

Si vous voulez faire une requête de plage, vous pouvez le faire comme dans ce post . Par exemple, interroger un jour spécifique (c'est-à-dire le 4 avril 2015):

> var objIdMin = ObjectId(Math.floor((new Date('2015/4/4'))/1000).toString(16) + "0000000000000000")
> var objIdMax = ObjectId(Math.floor((new Date('2015/4/5'))/1000).toString(16) + "0000000000000000")
> db.collection.find({_id:{$gt: objIdMin, $lt: objIdMax}}).pretty()

Pour obtenir les documents de 60 derniers jours dans la collection mongo, j'ai utilisé ci-dessous la requête dans shell.

db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})

comment trouver la commande (cette date [2015-1-12] à cette date [2015-1-15]):

db.collection.find ({_ id: {$ gt: ObjectId (Math.floor ((nouvelle date ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((nouvelle date ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}}). Pretty ()

Comptez le commandement (cette date [2015-1-12] à cette date [2015-1-15]):

db.collection.count ({_ id: {$ gt: ObjectId (Math.floor ((nouvelle date ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((nouvelle date ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})

Supprimer la commande (cette date [2015-1-12] à cette date [2015-1-15]):

db.collection.remove ({_id: {$ gt: ObjectId (Math.floor ((nouvelle date ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((nouvelle date ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})



En pymongo , cela peut être fait de la façon suivante:

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

L'utilisation de la fonction intégrée fournie par les pilotes mongodb dans Node.js vous permet d'interroger n'importe quel horodatage:

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

Alternativement, pour rechercher des enregistrements avant 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


En utilisant MongoObjectID vous devriez également trouver les résultats comme indiqué ci-dessous

db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});

Puisque les 4 premiers octets d'un objet ObjectId représentent un horodatage , pour interroger votre collection chronologiquement, il suffit de trier 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 le temps de génération de l'ObjectId comme suit:

id = some_object_id
generation_time = id.generation_time

La réponse choisie est excellente, et je l'utilise aussi. Cependant, si vous cherchez un moyen de valider la saisie de la date de l'utilisateur, vous devez savoir que l'objet Date est très persistant sur le fait de rendre ce qui peut sembler être des arguments de construction invalides dans les arguments valides. Le code de test unitaire suivant illustre le point:

QUnit.test( "valid date test", function( assert ) {
  //The following are counter-examples showing how the Date object will 
  //wrangle several 'bad' dates into a valid date anyway
  assert.equal(isValidDate(new Date(1980, 12, 15)), true);
  d = new Date();
  d.setFullYear(1980);
  d.setMonth(1);
  d.setDate(33);
  assert.equal(isValidDate(d), true);
  assert.equal(isValidDate(new Date(1980, 100, 150)), true);
  //If you go to this exterme, then the checker will fail
  assert.equal(isValidDate(new Date("This is junk")), false);
  //This is a valid date string
  assert.equal(isValidDate(new Date("November 17, 1989")), true);
  //but is this?
  assert.equal(isValidDate(new Date("November 35, 1989")), false);  
  //Ha!  It's not.  So, the secret to working with this version of 
  //isValidDate is to pass in dates as text strings... Hooboy
  //alert(d.toString());
});




javascript mongodb