async waterfall callback isn't called within mongoose save

I'm using express, mongoose, and async.

Within an update method on a controller, I'm calling the following:

//note: we're within a constructor's prototype method, hence the 'self'. also body is simply the request body.

    async.waterfall([
        function(callback) {
            self.collection.findById(body._id).exec(function(err, item) {
                if(item) {
                    callback(null, item);
                } else {
                    callback(err);
                }
            });
        },
        function(item, callback) {
            //callback(null, item); //makes this task work, but not what I need

            //merge two together models together, then save
            item.save( _.extend(item, body), function(err, item) {
                console.log('code here never seems to get called within the waterfall');
                callback(null, item);
            });
        }
    ], function(err, results) {
        console.log('hello', err, results);
        self.res.json(results);
    });

So basically what I'm trying to do is find a document by id, then merge the new object in with the one I just found, save it, and return the result as JSON. But the callback function nested within the .save never seems to get called. So the entire request seems to hang and the final function in the waterfall never gets called.

I might be wrong, but it seems that the save method's callback gets called asynchronously. How would I go about getting this to work?

Side note: If the save method's callback is async, then why does this seem to work?

    var _this = this;
    var item = new this.collection(this.req.body);
    item.save(function(err, data) {
        _this.res.json(data);
    });

That method returns the saved object as JSON just fine.

You are not using the Model.save method correctly. It just takes a callback as the first argument. You must fetch your item instance, then set your new property values on your item instance, then do item.save(callback);.