A partir de Mongoose 4+, no olvide establecer nuevo:verdadero junto con upsert o obtendrá el documento antiguo como valor de retorno, no el actualizado.
Esto es bastante complicado, especialmente cuando la solicitud crea un documento, como si no especificara nuevo:verdadero, recibe un documento nulo (no había ningún documento existente), pero no hay error.
var myObj = ...;
collection.findOneAndUpdate(
{uniqueAttr: myObj.uniqueAttr},
myObj,
{upsert: true, new: true},
function(...) {...}