【问题标题】:Mongoose: Count removed documentsMongoose:计算删除的文档
【发布时间】:2018-04-16 19:59:47
【问题描述】:

如何检查 Mongoose 模型的 remove-method 是否真的删除了某些东西?

MyModel.remove({_id: myId}, function(err, entry) {
  if(entry == null) next(new Error("ID was not found."));    // this doesn't work
}

我可以查看删除了多少文档吗?

Mongo-Documentationkristina1 写评论:

如果您在删除后调用 db.runCommand({getLastError:1}) 并且“n”字段将告诉您删除了多少文档。

但我不知道如何用 Mongoose 做到这一点。

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    Mongoose

    remove 回调的第二个参数是一个数字,包含删除的文档数。

    MyModel.remove({_id: myId}, function(err, numberRemoved) {
      if(numberRemoved === 0) next(new Error("ID was not found."));
    }
    

    Mongoose 4.x、MongoDB 3.x

    传递给remove 回调的第二个参数现在是一个对象,其中result.n 字段指示已删除文档的计数:

    MyModel.remove({_id: myId}, function(err, obj) {
      if(obj.result.n === 0) next(new Error("ID was not found."));
    }
    

    【讨论】:

    • 很奇怪,Mongoose 文档没有这个参数。 +1
    • @warriorpostman 在 3.8.21 中仍然有效;我刚才试了一下。
    • 这个答案是错误的。至少对于 Mongoose 版本 >= 4.1.3。在 MyModel.remove({_id: myId}, function(param1, param2) 中,param2 参数是一个看起来像这样的对象:{"ok":1,"n":0,"lastOp":"6219670646759096321","electionId":"562d1c70d1c0756238aaabb9"}。 Mongoose 在文档方面很糟糕,并且没有解释上述内容的含义。
    • @SproutCoder 查看更新的答案。感谢您的提示。
    • 如果这对您不起作用,请尝试 obj.n 我认为不再有结果包装器 /shrug
    【解决方案2】:

    我用最新版本的 mongoose 试过这个,但没有用。由于第二个参数作为运算结果返回,而不仅仅是计数。如下使用,它起作用了:

     Model.remove({
                myId: req.myId
            }, function(err, removeResult) {
                if (err) {
                    console.log(err);
                }
                if (removeResult.result.n == 0) {
                    console.log("Record not found");
                }
                Console.log("Deleted successfully.");
            });
    

    【讨论】:

      【解决方案3】:

      我在 2020 年偶然发现了这一点,并在 Mongoose 5.9.28 中发现结果不再需要结果包装器,因此使用 remove 在异步方法中获取已删除记录的计数如下所示:

      async function remove(query) {
        const result = await ItemModel.remove(query);
        return result.n;
      }

      当然,collection.remove 已弃用,取而代之的是 deleteOne 或 deleteMany,所以也试试这个。

      【讨论】:

        猜你喜欢
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 2019-01-02
        • 2014-05-01
        • 2019-07-16
        • 2021-02-10
        相关资源
        最近更新 更多