如何使用猫鼬删除子文档?

时间:2021-05-05 21:45:43

标签: node.js reactjs mongodb mongoose

我有一个具有以下架构的 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)
            }
        }
    )
})

2 个答案:

答案 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:“删除一个文档,其中 _idjobId 并且一些 _idtasks 数组中为 {{1 }}”。

您必须在更新操作中使用 $pull

类似的东西

taskId

注意 update 有两个对象:第一个是要更新的对象,第二个是要执行的“操作”。在这种情况下,使用给定的 Job.updateOne( {"_id": jobId}, { "$pull": { "tasks":{ "_id": taskId } } } ) 拉取子任务。

这个查询告诉 mongo:用给定的 _id 搜索一个对象并删除 _idtasks_id 子文档。

示例here