猫鼬:删除()返回已删除的项目
问题描述:
真正
我下面的代码返回“用户已删除”,即使用户已经删除。我宁愿扔在这种情况下,但我想查询数据库尽可能少。猫鼬:删除()返回已删除的项目
有没有办法让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.'});
});
在此先感谢!
答
上述方法的问题是,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.'});
});
答
猫鼬的Query#remove
接受回调有两个参数:
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.'});
});
你错过了功能实际上是检查返回值。您也接受了错误的答案,因为当您不需要时真正检索文档的开销是您应该避免的。 –