2016-03-31 73 views
1

我正在使用Node.js和MongoDB,我試圖設置一個DELETE路由。在負責處理刪除的函數中,我使用了Mongo的「$ pull」操作符。我現在看了幾個例子,我不知道我在做什麼錯。

這裏的數據庫文件是如何設置的一個樣本

{ 
"_id": { 
    "$oid": "123abc" 
}, 
"sleepData": [ 
    { 
     "date": "03/28/2016", 
     "hour": "11", 
     "minute": "11", 
     "meridiem": "PM", 
     "feeling": "7" 
    }, 
    { 
     "date": "03/29/2016", 
     "hour": "3", 
     "minute": "41", 
     "meridiem": "PM", 
     "feeling": "1" 
    }, 
    { 
     "date": "03/30/2016", 
     "hour": "1", 
     "minute": "29", 
     "meridiem": "AM", 
     "feeling": "5" 
    }, 
    { 
     "date": "03/30/2016", 
     "hour": "1", 
     "minute": "38", 
     "meridiem": "AM", 
     "feeling": "4" 
    }, 
    ] 
} 

*注近重複的數據,因此爲什麼我的$拉查詢是如此特殊的原因。

這裏是我的路線

module.exports.DELETE = function(req, res) { 
var sleepDataToDelete = { 
    date: req.query.date, 
    hour: req.query.hour, 
    minute: req.query.minute, 
    meridiem: req.query.meridiem, 
    feeling: req.query.feeling 
}; 

// next code block is what this console prints out 
console.log("Deleting req.query:\n", sleepDataToDelete); 

var sleepObjectId = req.query.sleepObjectId; 
var sleepDataCollection = db.get().collection('sleepData'); 
sleepDataCollection.update(
    { 
     _id: sleepObjectId 
    }, 
    { 
     $pull: { 
      sleepData: { 
       date: sleepDataToDelete.date, 
       hour: sleepDataToDelete.hour, 
       minute: sleepDataToDelete.minute, 
       meridiem: sleepDataToDelete.meridiem, 
       feeling: sleepDataToDelete.feeling 
      } 
     } 
    }, 
    function(err, result) { 
     if(err) { 
      console.log("err", err); 
      return res.status(400).end(); 
     } else { 
      console.log("Count: ", result.result.n); 
      console.log("Deleted! :) "); 
      return res.status(200).end(); 
     } 
    } 
); 

}功能;

這就是console.log(「刪除req.query:\ n」,sleepDataToDelete);打印出來,它也與sleepData數組中的第三個索引匹配。

Deleting req.query: 
{ 
    date: '03/30/2016', 
    hour: '1', 
    minute: '29', 
    meridiem: 'AM', 
    feeling: '5' 
} 

我甚至試圖把雙引號或單引號中的json字段名稱,但那也不起作用。修改的對象數量爲0.我也嘗試將「$ pull {...}」查詢簡化爲「date」而不是「date」,「hour」,「minute」,「meridiem」和「感覺。」這仍然導致print語句中的0個修改項目。

+0

實際參數''pull'中的內容實際上並不匹配內容。請注意,您不需要所有**屬性,而只需要確定要刪除的數組元素即'{「date」:「03/29/2016」,「hour」:「11」}'如果沒有其他元素帶有'「hour」:「11'。'$ pull'就像'$ elemMatch',因爲包含的參數是一個」查詢「,同時檢查'sleepObjecId'實際上是一個'ObjectId',就好像'nMatched'實際上是'0'那麼你基本上不匹配文檔 –

+0

@BlakesSeven我試圖匹配所有字段的原因是因爲可能有其他對象只有幾分鐘或幾小時不同。繼續檢查sleepObjectId,它是正確的,真正讓我困惑的是,爲了讓我調用我的刪除函數,我首先運行基於日期的搜索函數,如果搜索函數返回數據,我被允許刪除數組中的特定對象 – Papermate

+0

你應該從評論中刪除的是「檢查你的值」。如果你仍然不能根據它來解決問題,那麼你需要**在你的問題中包含正在使用的變量的值。我們所看到的只是變量名稱本身。這是問題的「內容」。 –

回答

0

As @BlakesSeven指出,我沒有在我的查詢中傳入ObjectId。所以,信用就交給他了。不用說,這解決了我的問題。