Mongoose与Express中findByIdAndUpdate覆盖首个数组元素问题求助
问题分析与解决方案
嘿,我仔细看了你的代码和数据,问题根源很明确:首次创建订单时,你没有把第一个餐品正确存入order数组字段里!
问题拆解
你的Order Schema定义了order是一个数组,结构是[{ meal: ObjectId, quantity: String }],但看你创建订单的代码:
let order = { user: req.user._id, meal: req.body.foodID, quantity: req.body.quantity, } Order.create(order, function (err, newOrder) { ... })
你把meal和quantity直接放在了订单对象的顶层,而不是塞进order数组里。这就导致首次创建的订单中,order字段是空数组(和你贴的Create()数据一致:"order" : [ ])——第一个餐品根本没被存储!后续用$push添加第二、第三个餐品时,自然就只有后面的内容,首个餐品相当于“凭空消失”了。
修复方案
1. 修正订单创建的对象结构
把第一个餐品正确放进order数组里,符合Schema的定义:
// 调整创建订单的对象结构 let orderData = { user: req.user._id, order: [{ meal: req.body.foodID, quantity: req.body.quantity }] };
这样首次创建订单时,order数组里就会包含第一个餐品,后续的$push操作也能正确追加新餐品。
2. 优化订单ID的存储方式
你用app.locals.orderID存储当前订单ID,在多用户场景下会出问题(多个用户同时操作会互相覆盖订单ID)。建议把订单ID存在用户的Session里,比如req.session.orderID,保证每个用户的订单独立:
修正后的完整路由代码
app.post("/menu/order", middlewareObject.isLoggedin, function (req, res) { // 构造符合Schema的订单数据 let orderData = { user: req.user._id, order: [{ meal: req.body.foodID, quantity: req.body.quantity }] }; if (req.session.orderID !== undefined) { Order.findByIdAndUpdate( req.session.orderID, { $push: { order: { meal: req.body.foodID, quantity: req.body.quantity } } }, function (err, updated) { if (err) { console.log(err); } else { console.log("UPDATED!") res.redirect("back"); } } ) } else { Order.create(orderData, function (err, newOrder) { if (err) { console.log(err) } else { console.log("CREATED!") req.session.orderID = newOrder._id; // 订单ID存在Session中 res.redirect("back"); } }) } })
额外小建议
- 可以把Schema里
order数组的quantity字段类型改成Number,毕竟数量是数值类型,后续做统计、计算会更方便。 - 操作数据库时建议用async/await代替回调函数,代码可读性和维护性会更好。
内容的提问来源于stack exchange,提问作者Denis Stojković Stole
相关产品推荐
相关产品推荐

