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

Posted

技术标签:

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

提前致谢!

【问题讨论】:

您错过的功能实际上是检查返回值。您还接受了错误的答案,因为您应该避免在不需要时实际检索文档的开销。 【参考方案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 个参数的回调:

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

【讨论】:

以上是关于Mongoose:remove() 对已删除的项目返回 true的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose Model.remove(callback) 不会从我的收藏中删除任何内容

使用express框架和mongoose在MongoDB删除数据

mongoose 删除 API

Mongoose 子文档预删除中间件未调用

mongoose实现批量删除的api/方法

Node.js/mongoose - 数组中的子文档不会删除/移除