Понимание мангуста 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()
})