A partir do Mongoose 4+, não se esqueça de definir new:true junto com upsert ou você obterá o documento antigo como valor de retorno, não o atualizado.
Isso é bastante complicado, especialmente quando a solicitação cria um documento, como se você não especificasse new:true, você recebe um documento nulo (não havia doc existente), mas nenhum erro.
var myObj = ...;
collection.findOneAndUpdate(
{uniqueAttr: myObj.uniqueAttr},
myObj,
{upsert: true, new: true},
function(...) {...}