簡體   English   中英

Mongoose - 刪除子文檔數組項

[英]Mongoose - delete subdocument array item

我為用戶提供了這個小架構:

{
 username: String,
 contacts: Array
}

例如,某些用戶的聯系人將如下所示:

{
 username: "user",
 contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}]
}

現在我需要從聯系人中刪除一個項目,所以我這樣做:

model.findByIdAndUpdate(23, {'$pull': {
              'contacts':{'id':'525.....etc'}
              }});

但似乎不起作用,沒有錯誤,但沒有被刪除,我只想為用戶返回此文檔:

{
     username: "user",
     contacts: [{'id':ObjectId('534.....etc'), 'approved': false}]
    }

如何實現這一目標?

$pull操作符實際上只是在它所操作的數組元素上執行條件。 似乎您的問題實際上可能並未表明您可能正在使用ObjectId默認為所有數組字段創建的ObjectId值。

因此,在導入ObjectId創建方法后,您可以像這樣查詢:

model.findByIdAndUpdate(23, {
    '$pull': {
        'contacts':{ '_id': new ObjectId(someStringValue) }
    }
});

或者實際上,您實際上可以更好地定義“架構”,並且貓鼬實際上會根據架構中定義的“類型”為您“自動轉換”ObjectId:

var contactSchema = new Schema({
    approved: Boolean
});

var userSchema = new Schema({
    username: String,
    contacts: [contactSchema]
});

這允許 mongoose 對嚴格類型的字段定義“遵循規則”。 所以現在它知道對於contacts 數組的每個元素實際上都有一個_id字段,並且該字段的“類型”實際上是一個ObjectId因此它會自動重新轉換作為真正ObjectId 提供的“String”值。

終於!

MongoDB:

"imgs" : {"other" : [ {
        "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg",
        "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg",
        "_id" : ObjectId("58433bdcf75adf27cb1e8608")
                                    }
                            ]
                    },
router.get('/obj/:id',  function(req, res) {
var id = req.params.id;



Model.findOne({'imgs.other._id': id}, function (err, result) {
        result.imgs.other.id(id).remove();
        result.save();            
    });

暫無
暫無

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

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