我正在尝试构造一个查询,该查询将返回日期字段大于另一个日期字段的对象,但是我似乎无法使其正常工作。
我的猫鼬Appointments
模式:
const AppointmentSchema = new mongoose.Schema({
createdAt: {
type: Date,
default: Date.now
},
expirationDate: {
type: Date,
default: Date.now
},
nextReminderAt: {
type: Date,
}
});
Appointments
数据:
[
{
"_id": "5d725a4a7b292f5f8ceff789",
"expirationDate": "2019-12-17 23:59",
"nextReminderAt": "2019-11-17 23:59"
},
{
"_id": "5d725c84c4ded7bcb480eaa0",
"expirationDate": "2019-12-17 23:59",
"nextReminderAt": "2019-11-17 23:59"
},
{
"_id": "5d725cb9c4ded7bcb480eaa1",
"expirationDate": "2019-12-17 23:59",
"nextReminderAt": "2020-11-17 23:59"
},
{
"_id": "5d725cd2c4ded7bcb480eaa2",
}
]
我的查询:
const appointments = await Appointment.find({ $expr: { $gt: [ "$expirationDate" , "$nextReminderAt" ] } });
这在某种程度上有效,这意味着它将按照我想要的去做,但是如果nextReminderAt
未定义,它仍将被视为有效的比较,但是我仍然认为有一种更好/更简单的方法来编写查询做我想做的。
我可以进行特定类型的比较吗?与==
和===
一样?
我是猫鼬/ mongo的新手,但仍然不知道编写它的正确方法。有任何想法吗?我可以用where
来写吗?
编辑: 我最终得到了想要的东西,但是我不知道这是不是最好的方法,或者是否会出现任何性能问题。尽管我已经阅读了许多有关mongo的好东西,但我认为我必须仔细阅读所有文档才能正确使用它:
const appointments = await Appointment.aggregate([{
"$match": {
"$and":[
{"nextReminderAt": {$exists: true,$gte: new Date(Date.now())}},
{"expirationDate": {$gte: new Date(Date.now())}},
{$expr: { $gt: [ "$expirationDate" , "$nextReminderAt" ] }}
]
}
}]);
我原本希望使用find
可以更轻松地完成类似的操作,但是我会继续搜索。据我所知,aggregate
并不是您平时所有的时间。