Descobri que o comando $pull também não funciona para mim, a menos que eu inclua o retorno de chamada na lista de argumentos.
Na minha situação, este formato não funcionou:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}});
Mas este formato fez:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}, function(err, data){
console.log(err, data);
});
De acordo com a documentação, parece que ambos devem funcionar, mas não funcionam. A razão é porque a primeira maneira requer que você chame .exec() no objeto retornado, enquanto a versão de retorno de chamada chama exec() automaticamente. Causou alguma confusão para mim também.
Então você precisa fazer algo assim:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}).exec();