最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

为什么mongoose的deleteOne和findById在删除的ID上起作用

IT培训 admin 17浏览 0评论

为什么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值包括:

  1. 一个4字节的时间戳值,代表ObjectId的创建,以]为单位>
  2. 自Unix时代以来的秒数
  3. 5字节随机值
  4. 3字节递增计数器,已初始化为随机值
  5. 生成任意MongoDB ObjectId:https://observablehq/@hugodf/mongodb-objectid-generator

为什么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值包括:

  1. 一个4字节的时间戳值,代表ObjectId的创建,以]为单位>
  2. 自Unix时代以来的秒数
  3. 5字节随机值
  4. 3字节递增计数器,已初始化为随机值
  5. 生成任意MongoDB ObjectId:https://observablehq/@hugodf/mongodb-objectid-generator

发布评论

评论列表 (0)

  1. 暂无评论