MEAN栈开发:Mongoose中Cart Schema的items数组长度获取方法
解决方案
问题原因
你代码里的cart是导出的Mongoose模型类,不是某一个用户对应的购物车文档实例,不存在items属性,所以直接调用cart.items.length会报错。需要先查询到对应用户的购物车文档,再读取items数组的长度。
实现方案
方案1:普通查询(同时需要购物车其他数据时使用)
先查询完整的购物车文档,再读取数组长度:
// 首先引入你定义的cart模型,替换成你实际的文件路径 const cart = require('./models/cart'); exports.arrlen = async function (req, res){ try { // 取当前用户id,一般从身份认证中间件挂载的req.user中获取,也可以从请求参数里取 const targetUserId = req.user.id || req.body.userId; // 查询对应用户的购物车文档 const userCart = await cart.findOne({ userId: targetUserId }); // 兼容用户还未创建购物车的情况,直接返回0 const itemsLength = userCart ? userCart.items.length : 0; console.log(itemsLength); // 需要返回给前端可打开下行注释 // res.json({ code: 0, data: itemsLength, msg: '获取成功' }); return itemsLength; } catch (error) { console.error('查询失败:', error); res.status(500).json({ code: 1, msg: '查询失败' }); } }
方案2:聚合查询(仅需要长度时性能更优)
直接通过MongoDB聚合能力统计数组长度,不需要返回整个购物车文档数据,资源消耗更低:
const mongoose = require('mongoose'); const cart = require('./models/cart'); exports.arrlen = async function (req, res){ try { const targetUserId = req.user.id || req.body.userId; const countResult = await cart.aggregate([ // 匹配对应用户的购物车文档 { $match: { userId: mongoose.Types.ObjectId(targetUserId) } }, // 仅返回items数组的长度,命名为itemCount字段 { $project: { itemCount: { $size: '$items' }, _id: 0 } } ]); const itemsLength = countResult.length ? countResult[0].itemCount : 0; console.log(itemsLength); return itemsLength; } catch (error) { console.error('查询失败:', error); res.status(500).json({ code: 1, msg: '查询失败' }); } }
注意事项
- 如果你使用了JWT等身份认证方案,一般身份校验中间件会把当前登录用户的信息挂载到
req.user上,直接取req.user.id即可,不需要前端传userId避免越权问题。 - 聚合查询时传入的userId是字符串的话需要转成ObjectId类型,普通findOne查询Mongoose会自动做类型转换不需要额外处理。
- 一定要做边界处理,用户首次使用购物车还没有生成对应文档时直接返回0,避免读取undefined的length属性报错。
内容的提问来源于stack exchange,提问作者Harkirat Singh
相关产品推荐
相关产品推荐

