You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MERN栈使用Mongoose如何更新Movies集合中嵌套数组内的多个对象?

Mongoose更新嵌套数组座位状态解决方案

方法1:基于现有查询逻辑修改后保存(适配你当前代码)

你已经可以定位到目标座位对象,直接修改属性后调用Mongoose文档的save()方法即可提交更新,修改后的代码如下:

app.post('/confirm/:movieId/:timeId', (req, res) => { 
    const movieId = req.params.movieId;
    const timeId = req.params.timeId;
    const selectedSeats = req.body;
    const length_timeId = timeId.length;

    Movies.findOne({ movieId }, (err, movie) => {
        if(err) return res.status(500).send("查询电影信息失败");
        const getTimeSlots = movie['timeslots'];
        const index = timeId.substring(1, length_timeId);
        const getSeats = getTimeSlots[parseInt(index)-1];

        // 遍历修改选中座位的预订状态
        for(var i=0; i<selectedSeats.length; i++) { 
            let row = parseInt(selectedSeats[i] / 5);
            let id = selectedSeats[i] % 5;
            // 直接修改属性值
            getSeats["seats"][row][id].isReserved = true;
        }

        // 提交修改到数据库
        movie.save((saveErr, updatedMovie) => {
            if(saveErr) return res.status(500).send("座位状态更新失败");
            res.status(200).send("预订成功");
        })
    })
})

方法2:直接执行更新语句(性能更优)

无需先查询文档,直接构造更新规则操作数据库,减少一次查询开销:

app.post('/confirm/:movieId/:timeId', (req, res) => { 
    const movieId = req.params.movieId;
    const timeId = req.params.timeId;
    const selectedSeats = req.body;
    const slotIndex = parseInt(timeId.substring(1, timeId.length)) - 1;
    const updateRules = {};

    // 构造所有需要更新的字段规则
    for(let i=0; i<selectedSeats.length; i++) {
        const row = parseInt(selectedSeats[i] / 5);
        const seatId = selectedSeats[i] % 5;
        updateRules[`timeslots.${slotIndex}.seats.${row}.${seatId}.isReserved`] = true;
    }

    // 直接执行更新操作
    Movies.updateOne(
        { movieId },
        { $set: updateRules },
        (err, result) => {
            if(err) return res.status(500).send("座位状态更新失败");
            res.status(200).send("预订成功");
        }
    )
})

注意事项

  • 并发预订场景下建议增加乐观锁或者事务逻辑,避免同一座位被重复预订
  • 入参建议增加合法性校验,避免传入非法的座位编号导致报错

内容的提问来源于stack exchange,提问作者CoderNewbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:54:04