引数リストにコールバックを含めない限り、$pullコマンドも機能しないことがわかりました。
私の状況では、この形式は機能しませんでした:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}});
しかし、この形式は次のようになりました:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}, function(err, data){
console.log(err, data);
});
ドキュメントによると、両方とも機能するはずですが、機能しないようです。その理由は、最初の方法では返されたオブジェクトに対して.exec()を呼び出す必要があるのに対し、コールバックバージョンでは自動的にexec()を呼び出すためです。私にも混乱を引き起こしました。
したがって、次のようなことを行う必要があります:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}).exec();