gpt4 book ai didi

javascript - 为什么 mongoose 的 deleteOne 和 findById 对已删除的 id 起作用

转载 作者:行者123 更新时间:2023-12-01 16:18:02 25 4
gpt4 key购买 nike

目前正在使用 nodejs 开发与 MongoDB 数据库通信的 API,我注意到删除文档后的特殊行为。

事实上,我的 API 有几个端点,允许检索数据库中的所有动物,使用相应的 id 检索特定动物或删除特定动物,再次使用要删除的文档的 id。

我不明白的结果会在删除文档后发生。确实,如下图所示,当我删除名为“Johnny”的动物的文档时,通过其 ID 查找它或通过相同 ID 删除它的查询继续工作,即使 get 没有返回任何内容并且删除表示没有执行任何操作。

enter image description here

就我个人而言,我期望的行为与我为删除传递了错误的 id 相同(如下所示),但如果 id 已在数据库中分配,则即使在删除后查询也能正常工作。

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 }));

};

最佳答案

MongoDB 不会在任何地方缓存已删除的 id。

问题是当你说 I passed a wrong id for a deletion ...您正在传递一个长度相同但不是所需格式的 id。这就是 Mongoose 向您抛出错误的原因。

但是,如果你按照 MongoDB 的 id 结构创建一个数据库中不存在的 id 并对其进行操作,MongoDB 仍然会返回成功和空结果。

尝试使用 5ea08034385a46666b05020f并运行 .findById()针对它的查询功能。它会成功返回一个空结果。

成功仅表示操作成功,但并不一定意味着它确实在数据库中找到了一些东西。

我无权访问您的数据库,因此 id 是随机生成的,但遵循 MongoDB ObjectId以下规则:

12 字节的 ObjectId 值包括:

  • 一个 4 字节的时间戳值,表示 ObjectId 的创建,单位为
  • 自 Unix 纪元以来的秒数
  • 一个 5 字节的随机值
  • 一个 3 字节递增计数器,初始化为随机值

  • 生成任意 MongoDB ObjectId:
    https://observablehq.com/@hugodf/mongodb-objectid-generator

    关于javascript - 为什么 mongoose 的 deleteOne 和 findById 对已删除的 id 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61368402/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com