簡體   English   中英

為什么 document.remove() 在 Mongoose、Node.js 中不起作用?

[英]Why is document.remove() not working in Mongoose, Node.js?

問題:我嘗試在以下代碼中使用 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"
    }
});

非常感謝您!

remove() 已被棄用,試試這個

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

您已經在 findByID 返回的findByID上使用了.remove() 您應該直接在您嘗試從中刪除文檔的 model 上使用刪除。 例如。 以下將起作用 -

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

如果您想使用foundPlayer本身在回調中使用,您也可以選擇使用以下內容 -

  • findOneAndDelete() / findByIdAndDelete() :查找匹配的文檔,將其刪除,將找到的文檔(如果有)傳遞給回調。 如果回調通過則立即執行,否則返回查詢 object。

希望這可以幫助 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM