A partire da Mongoose 4+, non dimenticare di impostare nuovo:vero insieme a upsert o otterrai il vecchio documento come valore di ritorno, non quello aggiornato.
Questo è abbastanza complicato soprattutto quando la richiesta crea un documento, come se non specifichi new:true, ricevi un documento nullo (non c'era un documento esistente), ma nessun errore.
var myObj = ...;
collection.findOneAndUpdate(
{uniqueAttr: myObj.uniqueAttr},
myObj,
{upsert: true, new: true},
function(...) {...}