猫鼬查询,其中一个日期字段大于另一个日期字段

时间:2019-11-17 15:41:45

标签: node.js mongodb mongoose

我正在尝试构造一个查询,该查询将返回日期字段大于另一个日期字段的对象,但是我似乎无法使其正常工作。

我的猫鼬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并不是您平时所有的时间。

0 个答案:

没有答案