I have the following schema.
const dish = new Schema({
name: {
type: string,
},
createdAt: {
type: Date,
},
)
I want to get the dishes that are created between yesterday 12AM to today's 12AM.
CodePudding user response:
const dish = await Dish.aggregate([
{
$match: {
$and: [
{ createdAt: { $lt: new Date(new Date().setHours(0, 0, 0))}},
{ createdAt: { $gte: new Date(new Date().setHours(0, 0, 0) - 24 * 60 * 60 * 1000)}}
]
}
}
]);
Edited: Here is the explanation.
new Date()
give you a date like 2022-11-15T22:14:00.000 00:00
but new Date().setHours(0,0,0)
will set the values to 12AM but also gives you value in millisecond like 1668449700000
.
Your createdAt has value in date like 2022-11-15T22:14:00.000 00:00
. Using { $lt: new Date().setHours(0, 0, 0)}}
it will try to compare value between a date and a integer [2022-11-15T22:14:00.000 00:00
, 1668449700000
] so you will get a wrong result.
So you need to put that into a new Date() to get the value in Date so that the $lt
can compare properly. new Date(new Date().setHours(0, 0, 0))}
will be equal to new Date(1668449700000)
which will give you a date value and the $lt
will also work properly.
As for the second condition, 24 * 60 * 60 * 1000
is 1 day in millisecond. So I've subtracted that to get the millisecond of yesterday's 12AM.