MongoDB查询返回数组如何提取totalGuests与attendedGuests存为变量
问题修正与实现方案
你现有代码存在两个核心问题:
res.render放在了统计查询逻辑之前,就算你算出totalGuests和attendedGuests也没法传递到前端模板- 直接调用
find方法返回的是MongoDB查询游标,不是实际的查询结果,你需要加await+调用toArray(),或者直接改用更适合单条查询的findOne方法
修正后可直接运行的代码
module.exports.showEvent = async(req, res,) => { const event = await Event.findById(req.params.id).populate('artist'); if (!event) { req.flash('error', 'Cannot find that Event'); return res.redirect('/events'); } const { guest_id } = req.cookies; // 改用findOne查询单条,直接拿到对象不用处理数组,记得加await const guestStats = await Event.collection.findOne({ _id: req.params.id}, { _id: 1, name: 1, guests: 1, totalGuests: { $size: "$guests" }, attendedGuests: { $size: { "$filter": { input: "$guests", cond: { $eq: [ "$$this.attended", "Y" ] } } } } }); // 提取两个值存入变量 const { totalGuests, attendedGuests } = guestStats; console.log('总报名人数:', totalGuests, '已出席人数:', attendedGuests); // 把两个变量传给模板,前端直接用变量名渲染即可 res.render('events/show', { event, totalGuests, attendedGuests }); };
取值逻辑说明
- 如果你坚持要用
find方法做查询,需要在后面加.toArray()拿到结果数组,再取数组第一个元素即可:const lookUpArr = await Event.collection.find(查询条件, 投影配置).toArray(); const { totalGuests, attendedGuests } = lookUpArr[0]; - 前端模板里可以直接读取传过去的
totalGuests和attendedGuests变量做展示,不需要额外处理。
内容的提问来源于stack exchange,提问作者econobro
相关产品推荐
相关产品推荐

