javascript - 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: "星期四" } ]})
解决方案
尝试这个:
SchemaModel.findOneAndUpdate(
{ course_id: req.body.course_id },
{ $pull: { "week_schedule.$[].slotsPerDay": req.body.slotID }},
{ new: true })
它使用所有位置运算符, $[]
。对于数组中的所有元素week_schedule
,它从嵌套数组中提取slotsPerDay
值等于 的元素req.body.slotID
。
推荐阅读
- sparql - 在 sparql 中使用 strafter 函数时,由于无效的行错误,它不会运行
- unity3d - 删除前一个对象后复制新对象
- java - 如何使用 MimeMessageHelper 发送带附件的电子邮件?
- sql-server - 如何在 SSIS 中创建 Row_Number?
- javascript - 使用 JS 在 ClickOn 后将图像放入 HTML div
- ios - 如何通过 XMPPFramework 设置 XMPPMessage 的延迟交付日期属性?
- javascript - 如何在网站上显示 facebook messanger 插件
- vb.net - 我可以通过 VB.net 中的标记引用计时器吗?
- laravel - 我想在这种情况下使用分离单行
- optimization - 来自 Scipy 的数学域误差最小化 SLSQP 约束优化