Понимание мангуста findOne(). Remove()

Как вы знаете, в mongoose мы можем удалить всех пользователей с возрастом 30 следующим образом:

User.find({age: 30}).remove(callback);

Теперь замените find() на findOne(), и я думаю, что он должен удалить только 1 пользователя:

User.findOne({age: 30}).remove(callback);

oh, не так, как я ожидал, вышеприведенный код также удаляет ALL вместо ONE

Итак, почему findOne().remove() удалить ALL вместо ONE? Это ошибка или функция и почему?

Спасибо заранее!

P/S: Я знаю, что findOneAndRemove() удалит одного пользователя для меня, но в этом вопросе я хочу понять findOne(). remove()

Ответ 1

Я задал этот вопрос команде mongoose и получил ответ:

https://github.com/LearnBoost/mongoose/issues/1851#issuecomment-31355346

Здесь сообщение от aheckmann

", что хороший catch. findOne просто устанавливает имя команды для запуска, remove() изменяет его обратно на команду рисования, но лимит не был установлен. Вероятно, мы должны изменить это в 3.9, чтобы findOne устанавливал предел также. "

Ответ 2

Оба find и findOne возвращают объекты запроса mongoose, которые содержат только информацию о модели и указанном запросе. Он не учитывает findOne, который применяется сначала в обратном вызове. То, что вы ожидаете, заключается в том, что параметры должны быть установлены как User.findOne({age: 30}, null, {limit: 1}).remove(), так как это удалит только один, и вы можете утверждать, что это ошибка, но это зависит от использования. Как вы уже указали, правильный путь - использовать findOneAndRemove().

Ответ 3

Я вроде как noob, но не нужно ли вы удалять его в обратном вызове, потому что это асинхронная функция? Попробуйте что-то вроде:

User.findOne({age: 30}, function(err, user){
    user.remove()
})