【问题标题】:Mongoose: remove() returns true for already deleted itemsMongoose:remove() 对已删除的项目返回 true
【发布时间】: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.'});
});

提前致谢!

【问题讨论】:

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

标签: node.js mongodb express mongoose database


【解决方案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 个参数的回调:

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

    【讨论】:

      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多