javascript - 如何在 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
解决方案
您不需要$where
那里 - 通常,避免$where
- 这是一项昂贵的操作 - 它提供了很大的灵活性,但要求数据库为集合中的每个文档处理 JavaScript 表达式或函数。
像这样使用smth:
let now = new Date();
...
.find({
$and: [
{startTime: {$lte: now}},
{endTime: {$gt: now}}
]})
此外,旁注 -4 < 3 < 5
是真的,因为它4 < 3
先执行,然后false < 5 === true
推荐阅读
- docker - docker compose 命令 down 和 up 不会创建新的图像和容器
- node.js - 使用 ExpressJS 和 React 部署时出现 404
- mysql - 如何在 Mysql 中检索匹配和不匹配的记录?
- python - 是否有任何方法通过使用元素树从 xml 文件制作多个数据框?
- flask - app_context 中的烧瓶 init_db 与否?有什么区别?
- linux - 栈帧是如何工作的?
- python - 当我使用 tf.keras.optimizers.schedules.ExponentialDecay 时,如何获取 TensorFlow 2.0 中 SGD 优化器的当前学习率?
- javascript - 如何检测占位符文本在输入字段中溢出?
- google-apps-script - 是否有可能将谷歌表格中的图表导入带有宏的新文件中?
- python - 如何将 Django Web 应用分发给用户?