Почему deleteOne & findById mon goose работают с удаленным идентификатором - PullRequest
3 голосов
/ 22 апреля 2020

В настоящее время разрабатывая API с nodejs, который взаимодействует с базой данных MongoDB, я заметил особое поведение после удаления документа.

Действительно, у моего API есть несколько конечных точек, которые позволяют извлекать всех животных в базы данных, чтобы получить указанный c один, используя соответствующий идентификатор, или удалить указанный c один, снова используя идентификатор документа для удаления.

Результаты, которые я не понимаю, произойдут однажды документ удален Действительно, как вы можете видеть на рисунке ниже, когда я удаляю документ животного с именем «Джонни», запросы на его поиск по его идентификатору или удаление по тому же идентификатору продолжают работать, даже если метод get ничего не возвращает и удаление указывает, что никакая операция не была выполнена.

enter image description here

Лично я ожидал того же поведения, как если бы я передал неверный идентификатор для удаления (видимый ниже ), но если идентификатор уже был назначен в базе данных, запросы работают даже после удаления.

When I tried to deleted a wrong ID

Имеет ли MongoDB «кэш» из удаленные документы для выполнения отката в случае нежелательного удаления?

Ниже вы найдете различные конечные точки, которые используют find, deleteOne & findById


exports.getAllAnimal = (req, res, next) => {
    Animal.find().sort({'customer' : 1})
    .then(animals => res.status(200).send(animals))
    .catch(error => res.status(400).send({ error: error.message }));
};


exports.getOneAnimal = (req, res, next) => {
    Animal.findOne({ _id: req.params.id })
        .then(animal => res.status(200).send(animal))
        .catch(error => res.status(400).send({ error: error.message }));
};


exports.deleteAnimal = (req, res, next) => {
    Animal.deleteOne({ _id: req.params.id })
        .then(thing => res.status(200).send({ message : 'Animal successfully deleted'}))
        .catch(error => res.status(400).send({ error: error.message }));

};

1 Ответ

2 голосов
/ 22 апреля 2020

MongoDB нигде не кэширует удаленный идентификатор.

Дело в том, что когда вы говорите I passed a wrong id for a deletion ..., вы передаете идентификатор такой же длины, но не в требуемом формате. Вот почему Mon goose выдает ошибку.

Однако, если вы будете следовать структуре id MongoDB, чтобы создать идентификатор, которого нет в базе данных, и выполнить операцию против него, MongoDB все равно вернет вы с успехом и пустой результат.

Попробуйте использовать 5ea08034385a46666b05020f и запустите функцию запроса .findById() против него. Он вернет вам с успехом пустой результат.

Успех означает только, что операция прошла успешно, но это не обязательно означает, что он действительно что-то находит в базе данных.

У меня нет доступа к вашей базе данных, поэтому идентификатор генерируется случайным образом, но в соответствии с приведенными ниже правилами MongoDB ObjectId:

12-байтовое значение ObjectId состоит из:

  1. 4-байтовое значение временной метки, представляющее создание ObjectId, измеренное в
  2. секундах с Unix эпохи
  3. 5-байтовое случайное значение
  4. с 3-байтовым приращением счетчик, инициализированный случайным значением

Создать произвольный объектный идентификатор MongoDB: https://observablehq.com/@hugodf / mongodb-objectid-generator

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...