首页 > 解决方案 > Mongoose 通过 ObjectID 从嵌套数组中拉出一个元素

问题描述

我有一个Schedule架构,我正在尝试从嵌套slotsPerDay数组中获取一个元素。

const scheduleSchema =  mongoose.Schema({
    course_id: {{type: mongoose.Schema.Types.ObjectId, ref: 'course' }}, 
    week_schedule: [{
        day: {type: String, required: true },
        slotsPerDay: [{type: mongoose.Schema.Types.ObjectId, ref: 'slots' }],
    }]
});

我正在尝试从封装在 week_schedule 数组中的 slotPerDay 数组中删除某个插槽 ObjectID,如下所示。

 SchemaModel.findOneAndUpdate(
         {course_id: req.body.course_id},
         { "$pull": { "week_schedule": { "slotsPerDay": {"_id": req.body.slotID }}}}
 ,{new:true})

但是,此查询删除了整个 week_schedule 数组及其所有插槽,而不仅仅是映射到查询中给定的 slotID 的一个。有什么帮助解决这个问题吗?

我试过 { "$pull": { "week_schedule.slotsPerDay": {"_id": req.body.slotID }}} 了,但我得到了错误

无法使用 (week_schedule.slotsPerDay) 的部分 (slotsPerDay) 遍历元素 ({week_schedule: [ { slotsPerDay: [ ObjectId('5fe0263872f7b53aac93334a'), ObjectId('5fe0263872f7b53aac933349'), ObjectId('5fe0263872f7b53a'b'3), 5fe0263872f7b53aac93334c'), ObjectId('5fe0263872f7b53aac93334d'), ObjectId('5fe0263872f7b53aac93334e'), ObjectId('5fe0263872f7b53aac93334f'), ObjectId('5fe0263872f7b53aac933350') ], _id: ObjectId('5fe0266a72f7b53aac933364'), day: "Saturday" }, { slotPerDay: [], _id: ObjectId('5fe0266a72f7b53aac933365'), day: "Sunday" }, { slotsPerDay: [], _id: ObjectId('5fe0266a72f7b53aac933366'), day: "Monday" }, { slotsPerDay: [ ObjectId(' 5fe0263872f7b53aac933356'), ObjectId('5fe0263872f7b53aac933357'), ObjectId('5fe0263872f7b53aac933359'), ObjectId('5fe0263872f7b53aac93335a') ], _id: ObjectId('5fe0266a72f7b53aac933368'), day: "Wednesday" }, { slotsPerDay: [ ObjectId('5fe0263872f7b53aac93335b'), ObjectId('5fe0263872f7b53aac93335c '), ObjectId('5fe0263872f7b53aac93335d'), ObjectId('5fe0263872f7b53aac93335e'), ObjectId('5fe0263872f7b53aac93335f'), ObjectId('5fe0263872f7b53aac933360'), ObjectId('5fe0263872f7b53aac933361'), ObjectId('5fe0263872f7b53aac933362') ], _id: ObjectId( '5fe0266a72f7b53aac933369'),日:“星期四”}]})Wednesday" }, { slotsPerDay: [ ObjectId('5fe0263872f7b53aac93335b'), ObjectId('5fe0263872f7b53aac93335c'), ObjectId('5fe0263872f7b53aac93335d'), ObjectId('5fe0263872f7b53aac93335e'), ObjectId('5fe0263872f7b53aac93335f'), ObjectId('5fe0263872f7b53aac933360'), ObjectId('5fe0263872f7b53aac933361'),ObjectId('5fe0263872f7b53aac933362')],_id:ObjectId('5fe0266a72f7b53aac933369'),天:“星期四”}]})Wednesday" }, { slotsPerDay: [ ObjectId('5fe0263872f7b53aac93335b'), ObjectId('5fe0263872f7b53aac93335c'), ObjectId('5fe0263872f7b53aac93335d'), ObjectId('5fe0263872f7b53aac93335e'), ObjectId('5fe0263872f7b53aac93335f'), ObjectId('5fe0263872f7b53aac933360'), ObjectId('5fe0263872f7b53aac933361'),ObjectId('5fe0263872f7b53aac933362')],_id:ObjectId('5fe0266a72f7b53aac933369'),天:“星期四”}]})5fe0263872f7b53aac933362') ], _id: ObjectId('5fe0266a72f7b53aac933369'), day: "星期四" } ]})5fe0263872f7b53aac933362') ], _id: ObjectId('5fe0266a72f7b53aac933369'), day: "星期四" } ]})

标签: javascriptnode.jsmongodbmongoose

解决方案


尝试这个:

SchemaModel.findOneAndUpdate(
     { course_id: req.body.course_id },
     { $pull: { "week_schedule.$[].slotsPerDay": req.body.slotID }},
     { new: true })

它使用所有位置运算符, $[]。对于数组中的所有元素week_schedule,它从嵌套数组中提取slotsPerDay值等于 的元素req.body.slotID


推荐阅读