[英]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.