【问题标题】:Why is document.remove() not working in Mongoose, Node.js?为什么 document.remove() 在 Mongoose、Node.js 中不起作用?
【发布时间】:2020-06-07 08:17:30
【问题描述】:

问题:我尝试在以下代码中使用 document.remove() 从数据库中删除一个文档,但 它不会从数据库中删除该文档。我确信 remove() 会被调用,因为我为“remove”设置的 pre hook 被调用了。

// Delete - delete a player and update the team
router.delete("/:player_id", function(req, res) {
    Player.findById(req.params.player_id, function(err, foundPlayer) {
        if(err) {
            console.log(err);
            req.flash("error", "Player you want to delete is NOT FOUND!");
            res.redirect("back");
            return;
        }
        foundPlayer.remove(function(err, removedPlayer) {
            if(!err) {
                console.log(removedPlayer); // prints null
            }
        }); // <<<<<<<<<<<
        res.redirect("back");
    });
});

然后我在下面的代码中使用了 model.findByIdAndRemove(),它成功了。

// Delete - delete a player and update the team
router.delete("/:player_id", function(req, res) {
    Player.findByIdAndRemove(req.params.player_id, function(err, foundPlayer) {
        if(err) {
            console.log(err);
            req.flash("error", "Player you want to delete is NOT FOUND!");
            res.redirect("back");
            return;
        }
        res.redirect("back");
    });
});

我有两个架构:

var TeamSchema = new mongoose.Schema({
    name: String,
    players: [
        {
            type: mongoose.Schema.ObjectId,
            ref: "Player"
        }
    ],
});

var PlayerSchema = new mongoose.Schema({
    name: String,
    team: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Team"
    }
});

非常感谢您!

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    remove() 已被弃用, 试试这个

    Player.deleteOne(req.params.player_id,function(err, removedPlayer) {
                if(!err) {
                    console.log(removedPlayer); // prints null
                }
            }); // <<<<<<<<<<<
    

    【讨论】:

      【解决方案2】:

      您已在 findByID 返回的 foundPlayer 上使用了 .remove()。您应该直接在您尝试从中删除文档的模型上使用删除。例如。以下将起作用 -

      Player.remove({_id:req.params.player_id},function(err, foundPlayer){
          if(!err)
              console.log(foundPlayer);
      });
      

      如果找到给定_id 的玩家,您将在控制台上记录一些类似这样的内容 -

      deleted
      { n: 1, ok: 1, deletedCount: 1 }
      


      注意:

      尝试使用remove() 可能会给你一个警告说 -

      DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
      

      因此,您必须根据需要使用 deleteOne 或 deleteMany。所以你的代码应该是这样的 -

      Player.deleteOne({_id:req.params.player_id},function(err, foundPlayer){
          if(!err)
              console.log(foundPlayer);
      });
      

      如果你想在回调中使用foundPlayerdoucment 本身,你也可以选择使用以下 -

      • findOneAndDelete() / findByIdAndDelete() :找到匹配的文档,将其删除,将找到的文档(如果有)传递给回调。如果回调被传递则立即执行,否则返回一个 Query 对象。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2015-02-25
        • 1970-01-01
        • 2014-08-20
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多