[英]How to update mongodb document with only checked checkbox data
如果我有如下所示的數據:
_id:60e2edf7014df85fd8b6e073
routineName:"test"
username: "tester"
monday:[{
_id: 60e430d45395d73bf41c7be8
exercise: "a"
}{
_id: 60e4329592e3fa445836d983
exercise: "b"
}]
tuesday:[{
_id:60e2ee8962c0c15840ecc69b
exercise: "c"
}]
從復選框表單推送數據的最佳方法是什么? 這是我到目前為止:
router.post('/routines/:username/:day', async (req, res) =>{ //add exercise from add page
let day = req.params.day
try{
await Routine.updateOne( {routineUsername: req.user.username}, { $push: { [day]: {$each: [
{exercise: req.body.a}, {exercise: req.body.b}, {exercise: req.body.c}, {exercise: req.body.d},
]} } } )
req.flash('success_msg', 'Exercise added to routine!')
res.redirect('/')
}
catch(error){
console.log(error)
}
})
這將更新文檔,但如果您只選中一個復選框,另一個復選框將存儲為空對象。 解決這個問題的方法是什么?
由於您只有特定的復選框。 您可以做的是首先通過檢查是否應用了復選框並僅將其推送到數組中來創建更新有效負載。
// destruct day
const { day } = req.params;
// create an empty payload
const updatePayload = { [day]: [] };
// now check your specific checkboxes
if (req.body.a) {
updatePayload[day].push({ exercise: req.body.a });
}
// and so on
// now finally update
await Routine.updateOne( {routineUsername: req.user.username}, updatePayload);
現在,這里的一件事是,我用新數組替換當前數組,因此之前勾選的復選框將被刪除並自動不被選中。 所以每次你都必須按下所有勾選的框。
處理復選框的更好方法是更改您當前的策略並在特定日期從前端推送一系列復選框。 將所有復選框存儲在 db 中並維護一個鍵,如isChecked
以檢查復選框是否被勾選。 然后你可以完全替換陣列。
像這樣的東西:
// destruct day and checkboxes
const { day, checkboxes } = req.params;
// and simply push
await Routine.updateOne( {routineUsername: req.user.username},
{ [day]: checkboxes });
同樣,也可以有許多其他方法來實現這一目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.