find document in today's date range in mongodb - mongodb

I have a collection, Plans. I want to find everything within the range of one month. Here is a sample of what the data could look like:
{
"_id": "someid",
"dateStart": ISODate("2015-03-01T00:00:00Z"),
"dateEnd": ISODate("2015-03-31T00:00:00Z"),
"items": [
"someotherid"
]
}
How can I find the Plan such that today's date is between dateStart and dateEnd?

To find a Plan such that today's date is between the dateStart and dateEnd fields, create a date object that holds the current date then use the $lt and $gt query operators on the date fields to query documents where today's date falls between the two fields:
currentDate = new Date();
Plans.find({
dateStart: { $lt: currentDate },
dateEnd: { $gt: currentDate }
});

date1 = new Date('3/1/15');
date2 = new Date('4/1/15');
Plans.find({
startDate: {$gte: date1},
endDate: {$lt: date2}
});
New Date objects initialize to 00:00:000 so you can use that to your advantage here. Also note that "less than 4/1" is equivalent to "less than or equal to midnight on 3/31" - but the former is much easier to write.
Also note that moment is a super handy utility for doing manipulations like this. For example: moment().endOf('month').toDate()
To add the package just do:
$ meteor add momentjs:moment

Related

mongodb date query don't work with ISODate?

I can find an item with this search:
db.item.find({"startdate":{$gte: 1485521569000 }})
The date seems to correspond to
> new Date(1485521569000)
ISODate("2017-01-27T12:52:49Z")
But if I search
db.item.find({"startdate":{"$gte" : ISODate("2017-01-01T00:00:00Z")}})
I don't get any results. What am I doing wrong?
PS
the only way I found is
db.item.find({"startdate":{"$gte" : (new Date("2017-01-01")).getTime()}})
is that right or there is a better way?
Below one will work.
db.getCollection('test').find({
"key": {
"$gte": (ISODate("2017-01-01")).getTime()
}
})
Reason:
You have your data is in int64 or long
In the new Date query, you are converting date to time which return int. So get performs integer comparison.
In ISODate you are passing a date, it doesn't convert date to integer i.e milliseconds. So if you convert, both will work.
new Date() returns the current date as a Date object. The mongo shell wraps the Date object with the ISODate helper
var d = ISODate("2017-01-01")
print(d); //Sun Jan 01 2017 05:30:00 GMT+0530 (IST)
Hence, the comparison fails.
If i understand, you have timestamp in startdate field,
This is the option if helps you, Can do it with aggregate() function, using $toDate,
$toDate convert timestamp to ISO date
db.collection.aggregate([
{
$match: {
$expr: {
$gte: [
{
$toDate: "$startdate"
},
ISODate("2017-01-27T12:52:49.000Z")
]
}
}
}
])
Playground: https://mongoplayground.net/p/H7SFHsgOcCu

I can not get dates after my current date

I want to obtain the records that the "FECHA_FIN" field is greater than or equal to today's date.
this is an example of my data:
but with this query:
db.getCollection('susp_programadas').find( {"FECHA_FIN":{ $gte: new Date("YYYY-mm-dd") }} )
I do not get results, what am I doing wrong? Thank you
You can convert the date to an ISO date and query that way. Since you stored the date as a string mongo has no idea how to query it against an ISO date without conversion.
If you stored your date in mongo as the default ISO date then you could have easily done this:
db.getCollection('susp_programadas').find({"FECHA_FIN":{$gte: new Date()}})
So this is how you can do it now:
db.getCollection('susp_programadas').aggregate([
{
$project: {
date: { $dateFromString: { dateString: '$FECHA_FIN' }}
}
},
{ $match: { date: { $gte: new Date() }}}
])
You can use the $dateFromString in an aggregate query with a $match to get the results you want. Note that $dateFromString is only available in MongoDB version 3.6 and up.
If there is no way to convert your data to ISODate or upgrade your DB you could also consider another solution which via $where:
db.getCollection('susp_programadas').find({
$where: function(){
return new Date(this.FECHA_FIN) > Date.now()
}
})
However that solution suffers from the fact that $where can not use indexes so have that in mind.

The most efficient way to returning today's documents from a collection

I have a collection where all the documents in that collection have a datetime timestamp that includes the time as well as the date.
When using the aggregation framework how do I say give me the values for today? The following only gives me the entries for midnight.
db.strategy.aggregate(
[
{
$match: {
"date": new Date()
}
},
]
);
To get the documents which have datetime values for today, you need to create a date query range where the start date object should hold the current date time hours at 00:00:00.000 (milliseconds precision) and set the hours for today's date to 23:59:59.999 to the end date variable.
For example:
// Create the start date which holds the beginning of today
var todayStart = new Date();
todayStart.setHours(0,0,0,0);
// Create the end date which holds the end of today
var todayEnd = new Date();
todayEnd.setHours(23,59,59,999);
// Create the date range query object
var query = {
"date": {
$gte: todayStart,
$lte: todayEnd
}
};
// using the find() method
db.strategy.find(query);
Or using the aggregate() method as
db.strategy.aggregate({ "$match": query });
You should get the value in range I.e. from today's 12AM time stamp to today's 23:59:59 timestamp.
Var d = new Date();
var startDate = d.setHours(0,0,0);
var endDate = d.setHours(23,59, 59);
db.strategy.aggregate(
[
{
$match: {
"date": {$gte: startDate, $lte: endDate}
}
},
]
);

Need help on Mongoid date range query

I need a help on mongoid date range query.
I am trying to query events that spans over certain date range.
The event collection has two fields in the database start_date and end_date.
What would be the query to, for example, find events that occur between 04-18-2015 to 04-28-2015?
This might be helpful to you :
db.collectionName.find({
"start_date": { $lt: endDate }, // add end date here
"end_date": { $gt: startDate } // add start date here
});

Meteorjs Mongodb how to query a date with momentjs

In Meteor, I create a winner document this way:
var winner = {
participant_id: array[randomIndex]["_id"], //don't worry about the array[randomIndex]
creation_date: new Date()
};
id = Winners.insert(winner);
Later, I want to know how many winners I have today. I tried it many ways, but I couldn't succeed to get the right result.
The last thing I tried is this one:
Winners.find({creation_date: {"$gte": moment().startOf('day'), "$lt": moment().add('days',1)}}).count();
But the result is always equal to zero.
I guess the reason is that moment().startOf('day') is not a date object but I've no clue how to query it the right way.
You need to convert the moment object back to a Date so meteor/mongo can process the query. You can do that by appending a call to toDate like so:
var startDate = moment().startOf('day').toDate();
var endDate = moment().add('days',1).toDate();
Winners.find({creation_date: {$gte: startDate, $lt: endDate}}).count();
Try this:
// the number of milliseconds since 1970/01/01:
creation_date:new Date().getTime()
and
// you can still use moment:
moment().startOf('day').valueOf()
// query:
Winners.find({
creation_date: {
"$gte": moment().startOf('day').valueOf(),
"$lt": moment().add('days',1).valueOf()
}
}).count();