簡體   English   中英

如何使用 mongoose 刪除子文檔?

[英]How to delete subdocument using 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 被發送到我的服務器,該特定任務應該從數據庫中刪除。 目前,該路由刪除父級(作業)而不是子級(任務)。 任何想法如何定位任務? 提前致謝!

應用程序.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)
            }
        }
    )
})

您應該使用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)
        }
      }
  );

})

您的代碼刪除了父級,因為 Mongo 刪除了與查詢匹配的文檔。 在這種情況下,您的“父級”匹配查詢,因為它有一個具有給定_id的子級。

通過查詢findOneAndDelete({'_id': jobId, 'tasks._id': taskId})你告訴 mongo:“刪除一個文檔,其中_idjobId並且一些_idtasks數組是taskId ”。

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

就像是

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

請注意,更新有兩個對象:第一個是要更新的 object,第二個是要執行的“操作”。 在這種情況下,使用給定的_id拉取子任務。

此查詢告訴 mongo:使用給定的_id搜索一個 object 並刪除_idtaskIdtasks子文檔。

這里的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM