当更新时未传递各个值时,数据库内的值设置为null

时间:2019-05-23 15:18:51

标签: node.js mongodb express mongoose

我想更新数据库中的一些键和值。我已经填写了一些字段,例如firstnamelastname,现在我想用个人资料图片,联系电话等更新这些文档。

当我使用update传递这些值时,已经设置的字段将变为空,即firstnamelastname变为空。我希望firstnamelastname像以前一样设置,如果用户不想更新这些值而只更新文档中的更高值。

如果用户想同时更新firstnamelastname以及个人资料照片,那么我也希望对其进行更新。

我使用了mongo的更新方法,并请求新值进行更新。我通过邮递员传递了新值,但没有传递数据库中已经存在的旧值。更新后,对于其值显示为空。

router.put('/:id/edit',upload.array("images",2),function(req,res,next){
    shopid= req.params.id,
    console.log(req.body);

     User.find({"_id":shopid}).update({
            firstname: req.body.firstname,
            lastname: req.body.lastname,
            contact_no : req.body.contact_no,
            images:{
                shop_logo:req.files[0].path,
                shop_picture: req.files[1].path,
             },
            shopname:req.body.shopname,
            updated_at: Date.now(),
    },function(err,data){
        if(err){
            res.json(err);
        }else{
            res.json(data);
         }
    });

});

结果:

_id: "5ce29ba3e0c2d825d9e5a39f"
firstname: null
lastname: "Gyaawali"
geo: Array
shopkeeper: true
created_at: 2019-05-20T12:20:51.407+00:00
updated_at: 2019-05-23T15:00:04.442+00:00
__v: 0
contact_no: 9837949483
pan_no:"55343fASDE"
images: Object
shop_logo: "public/shop_logo/images-1558623604437-flag-map-of-nepal-logo-C43E9EAFA..."
shop_picture: "public/shop_logo/images-1558623604439-flat-sale-background_23-21477500..."
shopname: "Hello.shop"

我不希望firstname字段被更改。但是它更改为null。

2 个答案:

答案 0 :(得分:2)

由于执行了该查询:您还要更新这些字段。即使您没有向其发送任何值,也要使用 null 更新这些字段(例如, req.body.firstname 为空,因为名字不在帖子中身体)。如果您不想更新它们,则不应在查询中包括这些字段。 如果您不想更新名字姓氏,但其他字段是,则查询应该是这样的:

User.find({"_id":shopid}).update({
        contact_no : req.body.contact_no,
        images:{
            shop_logo:req.files[0].path,
            shop_picture: req.files[1].path,
         },
        shopname:req.body.shopname,
        updated_at: Date.now(),
},function(err,data){
    if(err){
        res.json(err);
    }else{
        res.json(data);
     }
});

希望这个回答您的问题!

答案 1 :(得分:1)

只要预先检查密钥是否存在于req.body中,然后仅对其进行更新即可。如下所示:

router.put("/:id/edit", upload.array("images", 2), function (req, res, next) {
    let shopid = req.params.id;
    let {
        firstname,
        lastname,
        contact_no,
        shopname
    } = req.body;
    let updateObj = {};
    firstname && (updateObj.firstname = firstname);
    lastname && (updateObj.lastname = lastname);
    contact_no && (updateObj.contact_no = contact_no);
    shopname && (updateObj.shopname = shopname);
    updateObj.updated_at = Date.now();
    updateObj.images = {
        shop_logo: req.files[0].path,
        shop_picture: req.files[1].path
    };
    User.find({
        _id: shopid
    }).update(
        updateObj,
        function (err, data) {
            if (err) {
                res.json(err);
            } else {
                res.json(data);
            }
        }
    );
});