Mongoose:remove() 对已删除的项目返回 true
Posted
技术标签:
【中文标题】Mongoose:remove() 对已删除的项目返回 true【英文标题】:Mongoose: remove() returns true for already deleted items 【发布时间】:2017-07-10 18:31:20 【问题描述】:下面的代码返回“用户已删除”,即使用户已被删除。在这种情况下,我更愿意抛出 404,但我想尽可能少地查询数据库。
有没有办法获得userNotFound
(见下文)而无需手动检查用户在删除之前是否存在?也许我错过了remove()
的一个功能或替代功能。
var itemId = 123;
Item.remove(id: itemId, function(err)
if (err)
return res.json(success: false, msg: 'Cannot remove item');
// !!!
if (userNotFound)
return res.status(404).json(success: false, msg: 'User not found');
// /!!!
res.json(success: true, msg: 'User deleted.');
);
提前致谢!
【问题讨论】:
您错过的功能实际上是检查返回值。您还接受了错误的答案,因为您应该避免在不需要时实际检索文档的开销。 【参考方案1】:上述方法的问题在于userNotFound
将始终为undefined
,因为您尚未在回调参数中定义它。最好使用 findOneAndRemove()
函数,这样您可以在找到时返回已删除的文档:
var itemId = 123;
Item.findOneAndRemove( id: itemId )
.exec(function(err, item)
if (err)
return res.json(success: false, msg: 'Cannot remove item');
if (!item)
return res.status(404).json(success: false, msg: 'User not found');
res.json(success: true, msg: 'User deleted.');
);
【讨论】:
【参考方案2】:Mongoose 的 Query#remove
接受带有 2 个参数的回调:
error
writeOpResult
如果您检查writeOpResult
对象,您应该能够轻松判断是否发生了删除。
它应该包含一个名为nRemoved
的字段。如果是0
,则没有删除任何文档,否则如果是数字,则已删除了许多文档。同样,它有一个名为 nMatched
的字段,它告诉您有多少文档与您的查询匹配。
所以对于你的情况,它变成这样:
var itemId = 123;
Item.remove(id: itemId, function(error, writeOpResult)
if (error)
return res.json(success: false, msg: 'Cannot remove item');
if (writeOpResult.nMatched === 0)
return res.status(404).json(success: false, msg: 'User not found');
res.json(success: true, msg: 'User deleted.');
);
【讨论】:
以上是关于Mongoose:remove() 对已删除的项目返回 true的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose Model.remove(callback) 不会从我的收藏中删除任何内容