繁体   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