Está utilizando $set
operador varias veces. La sintaxis correcta para $set
es :
{ $set: { <field1>: <value1>, ... } }
Necesitas cambiar tu actualización argumento como este:
Book.findOneAndUpdate({ "_id": bookId }, { "$set": { "name": name, "genre": genre, "author": author, "similar": similar}}).exec(function(err, book){
if(err) {
console.log(err);
res.status(500).send(err);
} else {
res.status(200).send(book);
}
});