我有以下模式。
const dish = new Schema({ name: { type: string, }, createdAt: { type: Date, }, )
我想得到昨天12AM到今天12AM之间制作的菜肴。
aiazj4mn1#
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)}} ] } } ]);
编辑:以下是解释。new Date()给予类似于2022-11-15T22:14:00.000+00:00的日期,但new Date().setHours(0,0,0)会将值设置为12AM,但也会提供类似于1668449700000的毫秒值。createdAt的日期值如2022-11-15T22:14:00.000+00:00。使用{ $lt: new Date().setHours(0, 0, 0)}}时,它将尝试比较date和integer[ 2022-11-15T22:14:00.000+00:00,1668449700000 ]之间的值,因此您将得到错误的结果。因此,您需要将其放入一个新的Date()中,以获取Date中的值,以便$lt可以正确比较。new Date(new Date().setHours(0, 0, 0))}将等于new Date(1668449700000),这将为您提供一个日期值,$lt也将正常工作。对于第二个条件,24 * 60 * 60 * 1000是以毫秒为单位的1天,所以我减去了它,得到了昨天上午12点的毫秒。
new Date()
2022-11-15T22:14:00.000+00:00
new Date().setHours(0,0,0)
1668449700000
{ $lt: new Date().setHours(0, 0, 0)}}
$lt
new Date(new Date().setHours(0, 0, 0))}
new Date(1668449700000)
24 * 60 * 60 * 1000
1条答案
按热度按时间aiazj4mn1#
编辑:以下是解释。
new Date()
给予类似于2022-11-15T22:14:00.000+00:00
的日期,但new Date().setHours(0,0,0)
会将值设置为12AM,但也会提供类似于1668449700000
的毫秒值。createdAt的日期值如
2022-11-15T22:14:00.000+00:00
。使用{ $lt: new Date().setHours(0, 0, 0)}}
时,它将尝试比较date和integer[2022-11-15T22:14:00.000+00:00
,1668449700000
]之间的值,因此您将得到错误的结果。因此,您需要将其放入一个新的Date()中,以获取Date中的值,以便
$lt
可以正确比较。new Date(new Date().setHours(0, 0, 0))}
将等于new Date(1668449700000)
,这将为您提供一个日期值,$lt
也将正常工作。对于第二个条件,
24 * 60 * 60 * 1000
是以毫秒为单位的1天,所以我减去了它,得到了昨天上午12点的毫秒。