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

6
我的下面代码即使用户已被删除也会返回“User deleted”。在这种情况下,我希望抛出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.'});
});

提前致谢!


你错过的功能实际上是检查返回值。你还接受了错误的答案,因为当你不需要检索文档时,实际上检索文档的开销是应该避免的。 - Neil Lunn
2个回答

12

以上方法存在的问题是,因为你没有在回调参数中定义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.'});
    });

4

Mongoose的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.'});
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接