首页 > 解决方案 > 如何在 mongoose 中获取当前时间在文档中两个日期值范围内的文档?

问题描述

我正在制作一个 api 来使用 mongoose 获取正在进行的/下一个考试,我有两个值:模型中的 startTime 和 endTime,我想获取正在进行的当前考试:
(PS:我使用了 fastify)
模型:

const mongoose = require("mongoose")
const { SchemaTypes } = require("mongoose")

const ExamsSchema = new mongoose.Schema({
  startTime: SchemaTypes.Date,
  endTime: SchemaTypes.Date,
  subject: SchemaTypes.String,
})

const Exams = mongoose.model("Exams", ExamsSchema)

module.exports = { Exams }

我尝试这样做,但每次都返回“无”(我在数据库中已经有 2 个测试考试,数据库没有问题): api 响应


fastify.get('/', async function (request, reply) {
  const exam = await Exams.findOne({
    $where: function () {
      const now = Date.now()
      return this.startTime.valueOf() > now > this.endTime.valueOf()
    }
  })
  
  if (exam) {
    reply.send({msg: "ongoing", ...exam._doc})
  } else {
    const nextExam = await Exams.find({
      $where: () => {
        const now = Date.now()
        return (now < this.startTime.valueOf())
      }
    })[0]
    if (nextExam) {
      reply.send({msg: "next", ...nextExam})
    } else {
      reply.send({msg: "none"})
    }
  }
})

数据库中的两个文档:

{
  "startTime": {
    "$date": "2021-07-21T04:00:00.000Z"
  },
  "endTime": {
    "$date": "2021-07-21T05:30:00.000Z"
  },
  "subject": "SomeSubject"
}
{
  "startTime": {
    "$date": "2021-07-21T03:00:00.000Z"
  },
  "endTime": {
    "$date": "2021-07-21T04:30:00.000Z"
  },
  "subject": "SomeSubject"
}

当前时间是 2021-07-21T03:35:00.000Z

标签: javascriptmongodbmongoose

解决方案


您不需要$where那里 - 通常,避免$where- 这是一项昂贵的操作 - 它提供了很大的灵活性,但要求数据库为集合中的每个文档处理 JavaScript 表达式或函数。

像这样使用smth:

let now = new Date();
...
.find({
  $and: [
    {startTime: {$lte: now}},
    {endTime: {$gt: now}}
  ]})

此外,旁注 -4 < 3 < 5是真的,因为它4 < 3先执行,然后false < 5 === true


推荐阅读