Is there a method to query the creation date information stored in ObjectIds?
Is there a method to query the creation date information stored in ObjectIds?
Diving Deep into Embedding Timestamps in ObjectIds provides a comprehensive guide on querying based on dates embedded within the ObjectId.
In brief, here's how it can be done in JavaScript:
/* Function to embed datetime into an ObjectId */
/* Supports both Date object and string input */
function objectIdWithTimestamp(timestamp) {
/* Convert string date to Date object (or assume timestamp is already 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
}
/* Query to find documents created after midnight on May 25th, 1980 */
db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } });
If you are using pymongo
, one way to achieve this is:
import datetime
from bson.objectid import ObjectId
minutes = 15
generated_time = datetime.datetime.today() - datetime.timedelta(minutes=minutes)
dummy_object_id = ObjectId.from_datetime(generated_time)
query_result = list(database.collection.find({"_id": {"$gte": dummy_object_id}}))
When working with MongoDB in Node.js, you have the ability to query by any timestamp using built-in functions provided by Mongodb drivers:
var currentTimestamp = Date.now();
var objectIdFromTime = ObjectID.createFromTime(currentTimestamp / 1000);
If you need to search for records before the current time, you can simply generate a new ObjectId:
var objectIdBefore = new ObjectID(); // or use ObjectId in the mongo shell
For more information, check out the documentation at http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
To extract the date from ObjectId in version 4.0, you can utilize the $convert
function.
For example,
$convert: { input: "$_id", to: "date" }
You can perform a query on the date by comparing between a start and end time for the 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")]}
]
}
})
Alternatively, you can achieve the same using the shorthand $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")]}
]
}
})
How can you search for the command (from date[2015-1-12]
to Date[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()
Calculate the number of commands (from date[2015-1-12]
to Date[2015-1-15]
):
db.collection.count({
_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")
}
})
Delete the commands (from date[2015-1-12]
to Date[2015-1-15]
):
db.collection.remove({
_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")
}
})
If you want to query your collection chronologically based on the timestamp in the first 4 bytes of an ObjectId, you can simply order by id:
# To get the oldest items first, use pymongo.ASCENDING; for most recent first, use pymongo.DESCENDING
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)
Once you have retrieved the documents, you can extract the generation time of the ObjectId using the following method:
id = some_object_id
generation_time = id.generation_time
Yes, it is possible to query objects by date using MongoDB's inserted ID.
db.collectionname.find({_id: {$lt: ObjectId.fromDate( new ISODate("TZformat") ) } });
Let's say we have a collection called users and we want to retrieve all users created before January 5th, 2018.
db.users.find({_id: {$lt: ObjectId.fromDate( new ISODate("2018-01-05T00:00:00.000Z") ) } });
To run a query for users created within the last 3 hours, you can use:
db.users.find({_id: {$lt: ObjectId.fromDate(new Date((new Date().getTime() - (1 * 3 * 60 * 60 * 1000))) ) } })
This will return all users created within the current time minus 3 hours.
I retrieved documents that are 60 days old from a MongoDB collection by executing the following query in the shell.
db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})
Looking to perform a range query? Check out this helpful resource that explains how to do it. For instance, if you want to query for data on a specific day (e.g., April 4th, 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()
Versions Used:
The solution provided by @s7vr was effective for me. Simply enter the following into the Filter field:
{$expr: { $and: [ {$gte: [{$toDate: "$_id"}, ISODate('2021-01-01')]}, {$lt: [{$toDate: "$_id"}, ISODate('2021-02-01')]} ] } }
Another valid approach is to consider the month index starting from 0, like so:
{_id: {$gte: ObjectId(Date(2021, 0, 1) / 1000), $lt: ObjectId(Date(2021, 1, 1) / 1000) } }
{_id: {$gte: ObjectId(ISODate('2021-01-01') / 1000), $lt: ObjectId(Date('2021-02-01') / 1000) } }
After executing these queries, I conducted a performance analysis with the results as follows:
Based on my evaluation, it seems that option 2 provides the best efficiency. However, I prefer Option 3 due to its simplicity of utilizing ISODate rather than dealing with 0-based indexing for months in Date objects.
According to the provided documentation:
o = new ObjectId()
date = o.getTimestamp()
By following this method, you will obtain a date in ISODate format.
For additional details, please refer to .
When utilizing MongoObjectID, you can retrieve results using the following approach:
db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});
When working with Rails and mongoid
, you have the ability to perform queries using the following syntax:
time = Time.utc(2010, 1, 1)
time_id = ObjectId.from_time(time)
collection.find({'_id' => {'$lt' => time_id}})
I've been experimenting with creating a dynamic table in React that allows users to add and delete rows. I need the data entered by the user to be saved, possibly using in-state management so that I can work with it later. Essentially, I'm looki ...
I'm a beginner with Angular 2 and I'm using 'ng2-ckeditor 1.0.7' in my Angular 2 application. The editor is functioning well within the app. However, I am now faced with the challenge of appending text at the cursor position. Unfortunat ...
I've recently updated my login scripts and sessions, and now I'm facing an issue with a dynamic search feature on my website. The search functionality is powered by jQuery and a PHP search file that retrieves results from a database of members. D ...
Currently experimenting with mongo db. I want to retrieve the last 5 or 10 elements from a collection. I plan to execute these queries in mongodb: SELECT * FROM records ORDER BY id DESC LIMIT 10 If feasible, I also would like to run: SELECT * FROM reco ...
My sidebar is a simple design in HTML with a script that causes it to open and close when the mouse enters and leaves. I utilized Vue.js for the entire sidebar, everything is functioning well except for one issue - when the mouse hovers over an item in the ...
Is it possible to use the index on a v-for directive at the same level as the directive itself in order to manipulate the state being displayed? <template> <div> <div v-for="share in sharesPurchased()" :key="share"> <div&g ...
Recently, I stumbled upon this interesting example fiddle showcasing the use of a comparator parameter to filter exact matches: http://jsfiddle.net/api/post/library/pure/ The priority is supposed to be a number between 1-100, but due to inputting it as t ...
Why does a void function pass as a plain object? Is this intentional or a mistake in the system? playground type PlainObject = { [key: string]: any }; const foo = (value: PlainObject) => { } const voidFn: () => void = () => { }; // Error as ex ...
I am looking to include an <AutoComplete /> field in my form. The options for this field are fetched through a get request, and here is the result displayed in the console. [ { "uid": "c34bb0ed-9f63-4803-8639-a42c7e2a8fb0&q ...
In my current ThreeJS project, I have encountered an issue when trying to swap one texture with another. The problem arises when the UV's become completely distorted after the texture switch. Below is the snippet of code that showcases how I am attemp ...
My current project involves creating a custom element, let's call it <parent-element>, that performs specific actions based on the presence of its childNodes. When I define the element like this: <parent-element> <div> </div&g ...
When working with a react component, I encountered an issue while mapping a simple array to a component. Here's an example: render() { return <div>10</div> } The above code works as expected. However, the following code snippet does ...
I am working on a form section that allows users to upload a file. I am looking to only have the filename sent to a text field within the same form. For example, if a user uploads "C:/Folder/image.jpg", I want the text field to display "image.jpg". I have ...
I attempted to address this warning by researching online. Unfortunately, I couldn't find a solution, so I am reaching out with this question. The current warning that I am encountering is: (node:39452) UnhandledPromiseRejectionWarning: Error [ERR_H ...
When using the Safari iOS browser, listening to scroll events triggers the console message every time, even during momentum. However, in the Cordova built app, the message is only triggered when the scroll has stopped. el-with-webkit-overflow-scrolling-to ...
I am working on a fun project that involves alternating between two images, one green and the other black. Here is the code snippet: <script> var switchImage = 1; var delayTime = 500; switchImages() function switchImages() { if (switchImage == 1) ...
Currently, I am delving into the world of nested arrays and attempting to locate a specific value within the array based on a condition. The data returned by the API is structured in the following format: data= { "ch_Id": "1234", "title": "Title" ...
How can I format backend data into a specific format using JavaScript? Even though I retrieve data from the backend, json_encode($myarry) does not display my data. $query = "SELECT * FROM LOCATIONS"; $result= mysql_query($query); while($row = mysql_fetch ...
My team and I are currently in the process of developing an application that combines Angular2 for the front-end and Web API ASP.NET for the back-end. We are currently at the stage of configuring a VPS for this application but unfortunately, we lack the ...
In the controller, the section responsible for spawning mdDialog appears as follows: $scope.removeAttendee = function(item) { console.log(item); $mdDialog.show({ controller: DialogController, templateUrl: 'views/removeMsg.tm ...