我有一个奇怪的错误与mongoose deleteOne()函数。今天我想在我的项目上工作,并得到了一个错误,而从一个集合中删除一个项目。它只是不删除文档,直到我为options对象使用硬编码参数,如下所示:
const { deletedCount } = await Model.deleteOne({symbol: 'hardcoded'})
// results in deletedCount = 1
但是如果我尝试使用动态字符串,比如:
const test = 'dynamic'
const { deletedCount } = await Model.deleteOne({symbol: test})
// results in deletedCount = 0
它不再从我的集合中删除文档。奇怪的是,昨天它还可以正常工作,并删除了该项目。
我尝试了另一件事,我读到关于deleteOne()的错误:
const { deletedCount } = await Model.deleteOne({symbol: JSON.stringifiy(symbol)})
但这也不行。
有谁知道出了什么问题吗?
只要可能,我总是默认使用id,以确保给定操作的目标数据没有错误。在这种情况下,这意味着用findByIdAndDelete()
代替。如果我不知道我试图删除的文档的id,那么只有我使用findOneAndDelete()
或deleteOne()
,就像你一样,用id以外的东西来标识我正在寻找的文档。
你确定传递给函数的键值对存在于数据库中吗?
问题解决。我不小心在字符串的末尾添加了一个额外的空格字符。这是非常奇怪的,因为这个错误从我的项目开始就存在,昨天它工作了。
所以对于每个可能有类似问题的人:
我有一个ejs模板文件,我渲染一个html元素,像这样:
<div id="<%= symbol %> ">
然后在请求服务器从列表中删除一个项目的事件处理程序中,我使用id属性作为主体中的请求参数。在路由处理程序中,此参数传递给mongoose:
const { symbol } = req.body
const { deletedCount } = await Model.deleteOne({ symbol })
正如我提到的。在最后一个ejs分隔符之后的模板文件中,有一个导致错误的额外空格字符。我通过复制monogse查询发现了这个问题,然后将其记录到控制台。在这里,我可以看到错误的条件参数。