mongoose更新对象的两种方法对比

演示

mongoose更新对象的两种方法对比_第1张图片
cart.gif

描述场景

更新购物车数量与勾选状态

业务逻辑

查询到当前用户的购物车对象Cart,更新前端传递过来的quantity与selected字段

方法一

var _ = require('underscore');

Cart.findOneAndUpdate({
        _id: req.body.cart._id,
        user: user
    }, _.pick(req.body.cart, 'quantity', 'selected'), {
        new: true
    },
    function(err, updatedCart) {
        res.send(
            utils.json({
                data: updatedCart
            })
        );
    }
);

注:_.pick相当于

    {
        quantity: req.body.cart.quantity,
        selected: req.body.cart.selected
    }

方法二

var _ = require('underscore');

Cart.findOne({
        _id: req.body.cart._id,
        user: user
    }, function(err, cart) {
        if (err) {
            console.log(err);
        }
        // 复制对象
        _.extend(cart, req.body.cart);
        cart.save(function(err, updatedCart) {
            res.send(
                utils.json({
                    data: updatedCart
                })
            );
        });
    }
);

对比

第一种代码使用findOneAndUpdate只用了一步,更加简洁,适用于更新的字段少且非常明确的场景

第二种先findOne再对entity进行save操作,利用了underscore对象复制,面向整个对象操作更加灵活,适用于字段多且不确定的场景

结论

需求总是在变的,所以我一般采用第二种。

mongoose更新对象的两种方法对比_第2张图片
praise
mongoose更新对象的两种方法对比_第3张图片
mp

你可能感兴趣的:(mongoose更新对象的两种方法对比)