Sé que los ObjectIds contienen la fecha en que fueron creados. ¿Hay alguna manera de consultar este aspecto del ObjectId?
Sé que los ObjectIds contienen la fecha en que fueron creados. ¿Hay alguna manera de consultar este aspecto del ObjectId?
Respuestas:
Hacer estallar marcas de tiempo en ObjectIds cubre consultas basadas en fechas incrustadas en ObjectId con gran detalle.
Brevemente en código 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') } });
~/.mongorc.js
archivo para tenerla disponible cuando se mongo
inicie el shell.
ObjectId(hexSeconds + "0000000000000000");
adb.ObjectID.createFromHexString(hexSeconds + "0000000000000000");
ObjectId()
con: require('mongoose').Types.ObjectId()
- donde require('mongoose')
está su instancia de Mongoose inicializada / configurada.
El uso de la función incorporada proporcionada por los controladores mongodb en Node.js le permite consultar por cualquier marca de tiempo:
var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);
Alternativamente, para buscar registros antes de la hora actual, simplemente puede hacer:
var objectId = new ObjectID(); // or ObjectId in the mongo shell
Fuente: http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
En pymongo
, se puede hacer de esta manera:
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}}))
pymongo
dependencia: epoch_time_hex = format(int(time.time()), 'x')
(no olvide agregar ceros para su consulta) Se utilizó el paquete de tiempo ( import time
).
Dado que los primeros 4 bytes de un ObjectId representan una marca de tiempo , para consultar su colección cronológicamente, simplemente ordene por id:
# oldest first; use pymongo.DESCENDING for most recent first
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)
Después de obtener los documentos, puede obtener el tiempo de generación del ObjectId de la siguiente manera:
id = some_object_id
generation_time = id.generation_time
cómo encontrar Buscar el comando (esta fecha [2015-1-12] a esta fecha [2015-1-15]):
db.collection.find ({_ id: {$ gt: ObjectId (Math.floor ((new Date ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((new Date ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}}). Pretty ()
Cuente el comando (esta fecha [2015-1-12] a esta fecha [2015-1-15]):
db.collection.count ({_ id: {$ gt: ObjectId (Math.floor ((new Date ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((nueva Fecha ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})
Elimine el comando (esta fecha [2015-1-12] a esta fecha [2015-1-15]):
db.collection.remove ({_ id: {$ gt: ObjectId (Math.floor ((new Date ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((nueva Fecha ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})
Puede usar la $convert
función para extraer la fecha de ObjectId a partir de la versión 4.0.
Algo como
$convert: { input: "$_id", to: "date" }
Puede consultar la fecha comparando entre la hora de inicio y finalización de la fecha.
db.collectionname.find({
"$expr":{
"$and":[
{"$gte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T00:00:00.000Z")]},
{"$lte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T11:59:59.999Z")]}
]
}
})
O
Puedes usar la taquigrafía $toDate
para lograr lo mismo.
db.collectionname.find({
"$expr":{
"$and":[
{"$gte":[{"$toDate":"$_id"}, ISODate("2018-07-03T00:00:00.000Z")]},
{"$lte":[{"$toDate":"$_id"},ISODate("2018-07-03T11:59:59.999Z")]}
]
}
})
Para obtener los documentos de los últimos 60 días en la colección mongo, utilicé la siguiente consulta en shell.
db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})
Si desea realizar una consulta de rango, puede hacerlo como en esta publicación . Por ejemplo, para consultar un día específico (es decir, 4 de abril de 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()
De la documentación:
o = new ObjectId()
date = o.getTimestamp()
de esta manera tienes una fecha que es un ISODate.
Mire http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingaseparatetimestampfield . para más información
Usando MongoObjectID también debería encontrar los resultados que se muestran a continuación
db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});
En rails mongoid
puedes consultar usando
time = Time.utc(2010, 1, 1)
time_id = ObjectId.from_time(time)
collection.find({'_id' => {'$lt' => time_id}})