我有一个具有以下架构的 mongoDB:
const jobSchema = new mongoose.Schema({
companyTitle: String,
status: String,
companyURL: String,
jobTitle: String,
jobURL: String,
jobDescription: String,
contactName: String,
contactRole: String,
contactPhone: String,
contactEmail: String,
tasks: [Task.schema]
})
const taskSchema = new mongoose.Schema({
taskItem: String,
isCompleted: Boolean
})
当用户单击按钮时,job._id 和 task._id 将发送到我的服务器,应从数据库中删除特定任务。目前,该路由删除父(作业)而不是子(任务)。任何想法如何定位任务?提前致谢!
app.js
app.delete('/tasks/:jobId/:taskId', (req, res) => {
const jobId = req.params.jobId
const taskId = req.params.taskId
Job.findOneAndDelete(
{'_id': jobId, 'tasks._id': taskId},
function (error, doc) {
if (error) {
console.log(error)
} else {
console.log(doc)
}
}
)
})
答案 0 :(得分:1)
您应该使用 findOneAndUpdate
而不是 findOneAndDelete
。你可以像这样重构你的代码:
app.delete('/tasks/:jobId/:taskId', async (req, res) => {
const jobId = req.params.jobId
const taskId = req.params.taskId
Job.findOneAndUpdate(
{"_id": jobId },
{"$pull": {"tasks": {"_id": taskId}}},
{new:true},
function (error, doc) {
if (error) {
console.log(error)
} else {
console.log(doc)
}
}
);
})
答案 1 :(得分:1)
您的代码删除了父级,因为 Mongo 删除了与查询匹配的文档。在这种情况下,您的“父级”匹配查询,因为它有一个具有给定 _id
的子级。
通过查询 findOneAndDelete({'_id': jobId, 'tasks._id': taskId})
,您告诉 mongo:“删除一个文档,其中 _id
为 jobId
并且一些 _id
到 tasks
数组中为 {{1 }}”。
您必须在更新操作中使用 $pull
:
类似的东西
taskId
注意 update 有两个对象:第一个是要更新的对象,第二个是要执行的“操作”。在这种情况下,使用给定的 Job.updateOne(
{"_id": jobId},
{
"$pull": {
"tasks":{
"_id": taskId
}
}
}
)
拉取子任务。
这个查询告诉 mongo:用给定的 _id
搜索一个对象并删除 _id
是 tasks
的 _id
子文档。
示例here