猫鼬:删除()返回已删除的项目

问题描述:

真正

我下面的代码返回“用户已删除”,即使用户已经删除。我宁愿扔在这种情况下,但我想查询数据库尽可能少猫鼬:删除()返回已删除的项目

有没有办法让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.'}); 
}); 

在此先感谢!

+0

你错过了功能实际上是检查返回值。您也接受了错误的答案,因为当您不需要时真正检索文档的开销是您应该避免的。 –

上述方法的问题是,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接受回调有两个参数:

  1. error
  2. 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.'}); 
});