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

Mongoose多层嵌套Schema数组$push更新问题及解决方案

多层嵌套Mongoose Schema中向boards.columns.tasks数组推送数据的问题与解决办法

问题场景

需在Mongoose的多层嵌套Schema结构中,向boards.columns.tasks数组推送数据,但原有实现方式无法完成更新。


Schema定义

const mongoose = require('mongoose')

const Schema = mongoose.Schema

const subtaskSchema = new Schema({
    title: String,
    isCompleted: Boolean,
})

const taskSchema = new Schema({
    title: String,
    description: String,
    status: String,
    subtasks: [subtaskSchema]
})

const columnSchema = new Schema({
    name: String,
    tasks: [taskSchema]
})

const boardSchema = new Schema({
    name: String,
    columns: [columnSchema]
})

const mainSchema = new Schema({
  boards: [boardSchema]
})

module.exports = mongoose.model('boards', mainSchema)

原有路由配置

router.patch('/tasks/:id', createTasks)

原有控制器代码

const createTasks = async (req, res) => {
    const { id } = req.params

    if (!mongoose.Types.ObjectId.isValid(id)) {
        return res.status(400).json({ error: '无效ID' })
    }

    // 尝试更新数据库
    try {
        const boards = await board.findOneAndUpdate({ "boards.columns._id": id }, {
            ...req.body
        })
        res.status(200).json(boards)
    } catch (error) {
        res.status(400).json({ error: error.message })
    }
}

现有数据结构

{
    "_id": "64562878b881a9551f5e5b1c",
    "boards": [
      {
        "name": "newboard",
        "_id": "6459d699de8a2cceb28ed604",
        "columns": [
          {
            "name": "newColumn",
            "_id": "6459d6b6de8a2cceb28ed60d",
            "tasks": [
              
            ]
          }
        ]
      }
    ],
    "__v": 0,
    "name": "trust"
  }

失败的尝试

尝试通过以下req.body向boards.columns.tasks数组推送数据:

{"$push": {"boards.columns.$.tasks": {"title": "newTitle"}}}

请求URL为:http://localhost:4000/api/boards/tasks/6459d6b6de8a2cceb28ed60d(参数id为columns的_id),但更新操作未生效。此前向boards.columns数组推送数据的方法可行,但此场景下失效。


解决方案

修改路由配置

router.patch('/tasks/:id/:id2', createTasks)

其中id对应board的_id,id2对应column的_id。

调整控制器代码

const createTasks = async (req, res) => {
    const { id, id2 } = req.params

    if (!mongoose.Types.ObjectId.isValid(id) || !mongoose.Types.ObjectId.isValid(id2)) {
        return res.status(400).json({ error: '无效ID' })
    }

    // 更新数据库
    try {
        const boards = await board.updateOne(
            { "boards._id": id, "boards.columns._id": id2 },
            { ...req.body }
        )
        res.status(200).json(boards)
    } catch (error) {
        res.status(400).json({ error: error.message })
    }
}

对应的请求体(req.body)

{ "$push": { "boards.$[].columns.$[].tasks": { "title": "newTask" } } }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:05:40