【问题标题】:How to delete subdocument using mongoose?如何使用猫鼬删除子文档?
【发布时间】:2021-07-28 05:41:50
【问题描述】:

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

【问题讨论】:

    标签: node.js reactjs mongodb mongoose


    【解决方案1】:

    您的代码删除了父级,因为 Mongo 删除了与查询匹配的文档。在这种情况下,您的“父级”匹配查询,因为它有一个具有给定_id 的子级。

    通过查询 findOneAndDelete({'_id': jobId, 'tasks._id': taskId}),您告诉 mongo:“删除一个文档,其中 _idjobId 和一些 _idtasks 数组是 taskId”。

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

    类似

    Job.updateOne(
      {"_id": jobId},
      {
        "$pull": {
          "tasks":{
            "_id": taskId
          }
        }
      }
    )
    

    请注意,更新有两个对象:第一个是要更新的对象,第二个是要执行的“操作”。在这种情况下,使用给定的_id 拉取子任务。

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

    例如here

    【讨论】:

      【解决方案2】:

      您应该使用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)
              }
            }
        );
      
      })
      

      【讨论】:

        猜你喜欢
        • 2019-06-06
        • 1970-01-01
        • 2016-07-30
        • 2016-11-09
        • 2022-11-24
        • 1970-01-01
        • 2021-05-16
        • 1970-01-01
        • 2014-08-03
        相关资源
        最近更新 更多