Saya tahu bahwa ObjectIds berisi tanggal pembuatannya. Apakah ada cara untuk menanyakan aspek ObjectId ini?
Saya tahu bahwa ObjectIds berisi tanggal pembuatannya. Apakah ada cara untuk menanyakan aspek ObjectId ini?
Jawaban:
Popping Stempel Waktu ke ObjectIds mencakup kueri berdasarkan tanggal yang disematkan di ObjectId dengan sangat rinci.
Secara singkat dalam kode 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
file Anda agar tersedia saat mongo
shell dijalankan.
ObjectId(hexSeconds + "0000000000000000");
kedb.ObjectID.createFromHexString(hexSeconds + "0000000000000000");
ObjectId()
dengan: require('mongoose').Types.ObjectId()
- di mana require('mongoose')
instance Mongoose yang diinisialisasi / dikonfigurasikan.
Menggunakan fungsi inbuilt yang disediakan oleh driver mongodb di dalam Node.js memungkinkan Anda melakukan kueri dengan cap waktu apa pun:
var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);
Atau, untuk mencari catatan sebelum waktu saat ini, Anda cukup melakukan:
var objectId = new ObjectID(); // or ObjectId in the mongo shell
Sumber: http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
Di pymongo
, dapat dilakukan dengan cara ini:
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
dependensi: epoch_time_hex = format(int(time.time()), 'x')
(jangan lupa menambahkan angka nol untuk kueri Anda) Paket waktu digunakan ( import time
).
Karena 4 byte pertama ObjectId mewakili cap waktu , untuk meminta koleksi Anda secara kronologis, cukup pesan dengan id:
# oldest first; use pymongo.DESCENDING for most recent first
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)
Setelah Anda mendapatkan dokumen, Anda bisa mendapatkan ObjectId ini waktu generasi seperti:
id = some_object_id
generation_time = id.generation_time
bagaimana menemukan Find the Command (tanggal ini [2015-1-12] hingga Tanggal ini [2015-1-15]):
db.collection.find ({_ id: {$ gt: ObjectId (Math.floor ((Tanggal baru ('2015/1/12')) / 1000) .toString (16) + "000000000000000000"), $ lt: ObjectId (Math.floor ((Tanggal baru ('2015/1/15')) / 1000) .toString (16) + "000000000000000000")}}). Pretty ()
Hitung Perintah (tanggal ini [2015-1-12] hingga Tanggal ini [2015-1-15]):
db.collection.count ({_ id: {$ gt: ObjectId (Math.floor ((Tanggal baru ('2015/1/12')) / 1000) .toString (16) + "000000000000000000"), $ lt: ObjectId (Math.floor ((Tanggal baru ('2015/1/15')) / 1000) .toString (16) + "000000000000000000")}})
Hapus Perintah (tanggal ini [2015-1-12] hingga Tanggal ini [2015-1-15]):
db.collection.remove ({_ id: {$ gt: ObjectId (Math.floor ((Tanggal baru ('2015/1/12')) / 1000) .toString (16) + "000000000000000000"), $ lt: ObjectId (Math.floor ((Tanggal baru ('2015/1/15')) / 1000) .toString (16) + "000000000000000000")}})
Anda bisa menggunakan $convert
fungsi untuk mengekstrak tanggal dari ObjectId mulai versi 4.0.
Sesuatu seperti
$convert: { input: "$_id", to: "date" }
Anda dapat meminta tanggal membandingkan antara waktu mulai dan waktu berakhir untuk tanggal.
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")]}
]
}
})
ATAU
Anda dapat menggunakan singkatan $toDate
untuk mencapai hal yang sama.
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")]}
]
}
})
Untuk mendapatkan dokumen-dokumen lama 60 hari terakhir dalam koleksi mongo saya gunakan di bawah permintaan dalam shell.
db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})
Jika Anda ingin membuat kueri rentang, Anda bisa melakukannya seperti di posting ini . Misalnya permintaan untuk hari tertentu (mis. 4 April 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()
Dari dokumentasi:
o = new ObjectId()
date = o.getTimestamp()
dengan cara ini Anda memiliki tanggal yang merupakan ISODate.
Lihatlah http://www.mongodb.org/display/DOCS/Optimating+Object+IDs#OptimizingObjectIDs-Extractinsioniontimesdromidrathanyadibandingkandenganmenyimpanandeparatetimestampfield . untuk informasi lebih lanjut
Menggunakan MongoObjectID Anda juga harus menemukan hasil seperti yang diberikan di bawah ini
db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});
Di rel, mongoid
Anda dapat meminta menggunakan
time = Time.utc(2010, 1, 1)
time_id = ObjectId.from_time(time)
collection.find({'_id' => {'$lt' => time_id}})