Mongoose:remove()为已删除的项返回true

时间:2017-02-21 08:28:13

标签: node.js mongodb express mongoose database

我的代码返回"用户已删除" 即使用户已被删除也是如此。在这种情况下,我更倾向于抛出 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.'});
});

提前致谢!

2 个答案:

答案 0 :(得分:7)

上述方法的问题是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.'});
    });

答案 1 :(得分:4)

Mongoose的Query#remove接受带有2个参数的回调:

  1. error
  2. writeOpResult
  3. 如果您检查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.'});
    });