簡體   English   中英

如何僅使用選中的復選框數據更新 mongodb 文檔

[英]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.

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