मुझे पता है कि ObjectIds में वे तारीख थी जो उन्होंने बनाई थी। क्या ObjectId के इस पहलू को क्वेरी करने का कोई तरीका है?
मुझे पता है कि ObjectIds में वे तारीख थी जो उन्होंने बनाई थी। क्या ObjectId के इस पहलू को क्वेरी करने का कोई तरीका है?
जवाबों:
ObjectIds में टाइमस्टैम्प्स को रोकना ObjectId में एम्बेडेड तारीखों के आधार पर प्रश्नों को बहुत विस्तार से कवर करता है।
संक्षेप में जावास्क्रिप्ट कोड में:
/* 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
फ़ाइल में सहेज सकते हैं जब mongo
शेल शुरू होता है।
ObjectId(hexSeconds + "0000000000000000");
todb.ObjectID.createFromHexString(hexSeconds + "0000000000000000");
ObjectId()
साथ बदलें : require('mongoose').Types.ObjectId()
- जहाँ require('mongoose')
आपका आरंभिक / कॉन्फ़िगर किया गया Mongoose उदाहरण है।
Node.js में मोंगोडब ड्राइवरों द्वारा प्रदान की गई इनबिल्ट फ़ंक्शन का उपयोग करना आपको किसी भी टाइमस्टैम्प द्वारा क्वेरी करने देता है:
var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);
वैकल्पिक रूप से, वर्तमान समय से पहले रिकॉर्ड की खोज करने के लिए, आप बस कर सकते हैं:
var objectId = new ObjectID(); // or ObjectId in the mongo shell
स्रोत: http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
में pymongo
, यह इस तरह से किया जा सकता है:
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
निर्भरता का उपयोग किए बिना : epoch_time_hex = format(int(time.time()), 'x')
(अपनी क्वेरी के लिए शून्य जोड़ना न भूलें) समय पैकेज का उपयोग किया गया था ( import time
)।
चूंकि ObjectId के पहले 4 बाइट्स आपके संग्रह को कालानुक्रमिक रूप से क्वेरी करने के लिए टाइमस्टैम्प का प्रतिनिधित्व करते हैं , बस आईडी द्वारा ऑर्डर करें:
# oldest first; use pymongo.DESCENDING for most recent first
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)
दस्तावेज़ प्राप्त करने के बाद, आप ObjectId की पीढ़ी का समय इस तरह प्राप्त कर सकते हैं :
id = some_object_id
generation_time = id.generation_time
इस दिनांक [2015-1-15] को कमांड (इस तिथि [2015-1-12]] को कैसे खोजें:
db.collection.find ({_ id: {$ gt: ObjectId (Math.floor ((नई तिथि (2015/1/12))) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId। (Math.floor ((नई तिथि ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})। सुंदर ()
कमांड की गणना (इस तिथि [2015-1-12] को इस तिथि [2015-1-15]):
db.collection.count ({_ id: {$ gt: ObjectId (Math.floor ((नई तिथि (2015/1/12))) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId। (Math.floor ((नई तिथि ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})
कमांड (इस तारीख [2015-1-12] को इस तारीख [2015-1-15]) को हटा दें:
db.collection.remove ({_ id: {$ gt: ObjectId (Math.floor ((नई तिथि (2015/1/12))) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId। (Math.floor ((नई तिथि ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})
आप $convert
4.0 संस्करण में शुरू होने वाले ऑब्जेक्टआईड से तारीख निकालने के लिए फ़ंक्शन का उपयोग कर सकते हैं ।
कुछ इस तरह
$convert: { input: "$_id", to: "date" }
आप दिनांक के लिए प्रारंभ और समाप्ति समय के बीच तुलना कर सकते हैं।
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")]}
]
}
})
या
आप इसे $toDate
प्राप्त करने के लिए आशुलिपि का उपयोग कर सकते हैं ।
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")]}
]
}
})
पिछले 60 दिनों के पुराने दस्तावेज़ों को प्राप्त करने के लिए मैंगो संग्रह में शेल में क्वेरी के नीचे इस्तेमाल किया गया था।
db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})
यदि आप एक श्रेणी क्वेरी बनाना चाहते हैं, तो आप इसे इस पोस्ट की तरह कर सकते हैं । उदाहरण के लिए किसी विशिष्ट दिन के लिए क्वेरी करना (अर्थात अप्रैल 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()
प्रलेखन से:
o = new ObjectId()
date = o.getTimestamp()
इस तरह से आपके पास एक तारीख है जो एक आयोडेट है।
Http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingeeparatetimestampfield पर देखें । अधिक जानकारी के लिए
MongoObjectID का उपयोग करते हुए आपको नीचे दिए गए परिणाम भी प्राप्त करने चाहिए
db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});
रेल में mongoid
आप उपयोग करके क्वेरी कर सकते हैं
time = Time.utc(2010, 1, 1)
time_id = ObjectId.from_time(time)
collection.find({'_id' => {'$lt' => time_id}})