mongoose的deleteOne和findById在删除的ID上起作用"/>
为什么mongoose的deleteOne和findById在删除的ID上起作用
当前正在使用与MongoDB数据库通信的nodejs开发API,删除文档后我注意到了一种特殊行为。
事实上,我的API具有多个端点,这些端点允许检索数据库中的所有动物,使用相应的ID检索特定的动物,或者再次使用要删除的文档的ID删除特定的动物。
删除文件后,我无法理解的结果就会发生。确实,如您在下面的图片中所见,当我删除名为“ Johnny”的动物的文档时,即使get返回没有任何结果,并且通过其ID查找它或通过相同的ID删除它的查询仍继续起作用。删除表示尚未执行任何操作。
我个人希望获得与删除错误的ID相同的行为(下面可见),但是,如果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 }));
};
回答如下:MongoDB不会在任何地方缓存已删除的ID。
事实是,当您说I passed a wrong id for a deletion ...
时,您传递的ID具有相同的长度,但不是必需的格式。这就是为什么猫鼬向您抛出错误的原因。
但是,如果您遵循MongoDB的ID结构来创建数据库中不存在的ID并对其进行操作,则MongoDB仍会成功返回您并且返回空结果。
尝试使用5ea08034385a46666b05020f
并对其运行.findById()
查询功能。这将使您成功返回一个空结果。
成功仅表示该操作成功,但不一定意味着它实际上在数据库中找到了东西。
我无权访问您的数据库,因此ID是随机生成的,但遵循以下MongoDB ObjectId
规则:
12字节的ObjectId值包括:
- 一个4字节的时间戳值,代表ObjectId的创建,以]为单位>
- 自Unix时代以来的秒数
- 5字节随机值
- 3字节递增计数器,已初始化为随机值
生成任意MongoDB ObjectId:https://observablehq/@hugodf/mongodb-objectid-generator
更多推荐
为什么mongoose的deleteOne和findById在删除的ID上起作用
发布评论