简体   繁体   English

ZCCADCDEDB567ABAE643E15DCF0974E503Z 按 ObjectID 从嵌套数组中拉出一个元素

[英]Mongoose Pull one element from a nested Array by ObjectID

I have a Schedule Schema and I'm trying to an element from a nested slotsPerDay array.我有一个Schedule Schema,我正在尝试从嵌套的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' }],
    }]
});

I'm trying to delete a certain slot ObjectID from the slotsPerDay array that's encapsulated inside the week_schedule array as follows.我正在尝试从封装在 week_schedule 数组中的 slotPerDay 数组中删除某个插槽 ObjectID,如下所示。

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

However, this query deletes the whole week_schedule array with all it's slots, not just the one mapping to the slotID given in query.但是,此查询删除了整个 week_schedule 数组及其所有插槽,而不仅仅是映射到查询中给定的 slotID 的一个。 Any help fixing that?有什么帮助解决这个问题吗?

I tried { "$pull": { "week_schedule.slotsPerDay": {"_id": req.body.slotID }}} but I get the error我试过{ "$pull": { "week_schedule.slotsPerDay": {"_id": req.body.slotID }}}但我得到了错误

Cannot use the part (slotsPerDay) of (week_schedule.slotsPerDay) to traverse the element ({week_schedule: [ { slotsPerDay: [ ObjectId('5fe0263872f7b53aac93334a'), ObjectId('5fe0263872f7b53aac933349'), ObjectId('5fe0263872f7b53aac93334b'), ObjectId('5fe0263872f7b53aac93334c'), ObjectId('5fe0263872f7b53aac93334d'), ObjectId('5fe0263872f7b53aac93334e'), ObjectId('5fe0263872f7b53aac93334f'), ObjectId('5fe0263872f7b53aac933350') ], _id: ObjectId('5fe0266a72f7b53aac933364'), day: "Saturday" }, { slotsPerDay: [], _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('5fe0263872f7无法使用 (week_schedule.slotsPerDay) 的部分 (slotsPerDay) 遍历元素 ({week_schedule: [ { slotPerDay: [ 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('5fe0263872f7 b53aac93335d'), ObjectId('5fe0263872f7b53aac93335e'), ObjectId('5fe0263872f7b53aac93335f'), ObjectId('5fe0263872f7b53aac933360'), ObjectId('5fe0263872f7b53aac933361'), ObjectId('5fe0263872f7b53aac933362') ], _id: ObjectId('5fe0266a72f7b53aac933369'), day: "Thursday" } ]}) b53aac93335d'), ObjectId('5fe0263872f7b53aac93335e'), ObjectId('5fe0263872f7b53aac93335f'), ObjectId('5fe0263872f7b53aac933360'), ObjectId('5fe0263872f7b53aac933361'), ObjectId('5fe0263872f7b53aac933362') ], _id: ObjectId('5fe0266a72f7b53aac933369'), day : “周四” } ]})

Try this:尝试这个:

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

It uses the all positional operator , $[] .它使用所有位置运算符$[] For all elements in the week_schedule array, it pulls elements from the nested slotsPerDay array with a value equal to req.body.slotID .对于week_schedule数组中的所有元素,它从嵌套的slotsPerDay数组中提取值等于req.body.slotID的元素。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM