2014-10-08 38 views
6

我對用戶來說,這一點架構:貓鼬 - 刪除子文件陣列項目

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

但似乎不工作,n O錯誤,但它不被刪除,我只是想這個文檔返回給用戶:

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

如何實現這一目標?

回答

10

$pull操作者實際上只是執行在其上操作所述陣列元件上的條件。看起來你的問題可能並沒有真正表明你正在使用默認情況下爲所有數組字段創建的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] 
}); 

這讓貓鼬爲「遵守規則」的嚴格定義字段定義。所以現在知道,你實際上有觸點陣列的每個元素_id場,和那場「類型」實際上是一個ObjectId所以它會自動重新投「字符串」作爲一個真正的ObjectId提供的值。

+0

喜感謝,但現在我得到這個錯誤:** [MongoError:例外:不能使用的部分(contacts.id的觸點)橫貫元件({聯繫人:[{ID:物件( '543394bb964ac60915ceba8b' ),批准:false},{id:ObjectId('543399f9964ac60915ceba8c'),approved:false}]})**這可能是什麼?我用你的點註釋 - – sbaaaang 2014-10-08 09:08:39

+0

@sbaaaang你究竟在做什麼?你是否按照你的要求使用了「點符號」形式?順便說一句,謝謝你清楚地表明你的實際數據與你發佈的不同,這可能再次成爲問題的一部分。請編輯以顯示您的真實數據結構。 – 2014-10-08 09:20:45

+0

是使用*點符號*像你說的,是的即時通訊使用ObjectIds,但這不是我想的問題:P不準? (編輯問題) – sbaaaang 2014-10-08 09:21:41

1

finaly!

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