The 3D Web Coder

Mongodb Upsert

Last week, I searched for and struggled to implement an upsert call for my CompHound and FireRating samples, i.e. a REST PUT call that does both PUT to update the data of an existing record as well as POST to create a new record, if none exists.

I ended up implementing the update2 function calling the mongoose findOne function and then selecting either update or create based on whether an existing record is found.

Luckily, I asked my colleague Philippe Leefsma to review this, and he found a StackOverflow discussion on mongodb: insert if not exists that mentions a much easier solution, adding an argument specifying the options {upsert:true} to the update call.

That is exactly what I had searched for, fruitlessly, high and low.

After learning about the existence of this, I finally also found the official mongodb upsert Option documentation on it.

I implemented a new, simpler, update3 function making use of it, and it works flawlessly:

exports.update3 = function(req, res) {
  var id = req.params.id;
  console.log('Updating ' + id);
  Door.update({"_id":id}, req.body, {upsert:true},
    function (err, numberAffected) {
      if (err) return console.log(err);
      console.log('Updated %s instances', numberAffected.toString());
      return res.sendStatus(202);
  });
};

I added this to the fireratingdb repo and updated it to release 0.0.13.

I obviously also redeployed it to heroku, where it is running at fireratingdb.herokuapp.com.

Many thanks to Philippe for noticing and pointing this out!