使用Mongoose从MongoDB查询非数组形式的event_start单个字段值的方法
解决方案
你现有代码存在两个核心问题:
- 使用
find()方法查询单条数据:该方法默认返回所有匹配条件的文档数组,哪怕仅命中1条结果也会被包裹在数组中,查已知_id的单条数据应优先使用findById() - 未处理异步查询逻辑:Mongoose的数据库操作是异步IO,直接赋值只能拿到Query实例,无法获取实际返回数据,需要用
async/await处理
最简实现代码
// 中间件添加async关键字支持await module.exports.expiredEvent = async (req, res, next) => { try { const { id } = req.params; // 第二个参数为投影规则:仅返回event_start字段,移除默认返回的_id字段 const queryRes = await Event.findById(id, 'event_start -_id'); if (!queryRes) return res.status(404).json({msg: '对应活动不存在'}); // 直接取到event_start的Date类型值 const event_start = queryRes.event_start; // 此处即可和当前时间做比对 const currentTime = new Date(); if (event_start < currentTime) { return res.status(400).json({msg: '活动已过期'}); } next(); } catch (err) { // 捕获数据库异常传递给错误处理中间件 next(err); } }
其他可选实现
如果不想手动从返回对象中取属性,也可以用distinct方法直接拿到值的数组,单条查询时取数组第一个元素即可:
const [event_start] = await Event.distinct('event_start', {_id: id});
补充说明
- 投影规则除了写在查询的第二个参数,也可以链式调用
.select()方法实现,效果完全一致:await Event.findById(id).select('event_start -_id') - 若需要更高的查询性能,可以追加
.lean()方法将返回的Mongoose文档实例转为普通JS对象:await Event.findById(id, 'event_start -_id').lean()
内容的提问来源于stack exchange,提问作者econobro
相关产品推荐
相关产品推荐

