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
相关产品推荐
相关产品推荐

