NodeJS Mongoose模型deleteOne()仅适用于硬编码字符串

bxfogqkk  于 2023-01-25  发布在  Node.js
关注(0)|答案(2)|浏览(145)

mondoose deleteOne()函数出现了一个奇怪的错误。今天我想处理我的项目,但在从集合中删除一个项目时遇到了一个错误。它只是不删除文档,直到我为选项对象使用了一个硬编码参数,如下所示:

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

但这个也不管用。
有人知道出了什么问题吗?

2admgd59

2admgd591#

我总是默认使用id,以确保给定操作的目标数据没有错误,所以在这种情况下,这意味着使用findByIdAndDelete()代替,如果我不知道我试图删除的文档的id,那么我只会使用findOneAndDelete()deleteOne(),就像您所做的那样,除了ID之外的东西来识别我要找的文件。
您确定要传递给函数的键-值对存在于数据库中吗?

k97glaaz

k97glaaz2#

问题解决了。我不小心在字符串的末尾添加了一个额外的空格字符。这非常奇怪,因为错误从我的项目开始就存在,昨天它起作用了。
所以对于每个可能有类似问题的人:
我有一个ejs模板文件,在其中我呈现了一个html元素,如下所示:

<div id="<%= symbol %> ">

然后,在请求服务器从列表中删除一个项目的事件处理程序中,我使用id属性作为正文中的请求参数,在route处理程序中,这个参数被传递给mongoose:

const { symbol } = req.body
const { deletedCount } = await Model.deleteOne({ symbol })

正如我所提到的,在模板文件中,在最后一个ejs分隔符之后有一个额外的空格字符导致了这个错误。我通过复制monoogse查询并将其记录到控制台来发现这个问题。在那里我可以看到错误的条件参数。

相关问题