2014-10-08 5 views
6

मैं उपयोगकर्ताओं के लिए इस छोटे से स्कीमा है:नेवला हटाना subdocument सरणी आइटम

{ 
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 ओ त्रुटियों लेकिन इसे नष्ट नहीं किया जाता है, मैं सिर्फ उपयोगकर्ता के लिए इस दस्तावेज़ वापस जाने के लिए करना चाहते हैं:

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

यह कैसे प्राप्त करने के लिए?

उत्तर

10

$pull ऑपरेटर वास्तव में केवल उस सरणी तत्व पर स्थितियों को निष्पादित करता है जिस पर यह चल रहा है। ऐसा लगता है कि आपका प्रश्न वास्तव में यह नहीं दिखा सकता है कि आप शायद ObjectId मान के साथ काम कर रहे हैं कि mongoose सभी सरणी फ़ील्ड के लिए डिफ़ॉल्ट रूप से बनाता है।

तो तुम इस तरह आपकी क्वेरी के लिए कर सकता है, 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 है, इसलिए यह स्वचालित ऑब्जेक्ट आईडी के रूप में स्वचालित रूप से "स्ट्रिंग" मानों को फिर से डाला जाएगा।

+0

हाय धन्यवाद, लेकिन अब मैं इस त्रुटि मिली: ** [MongoError: अपवाद: [{आईडी:: ObjectId ('543394bb964ac60915ceba8b' तत्व ({संपर्क पार करने के लिए भाग (contacts.id के संपर्क) उपयोग नहीं कर सकते), अनुमोदित: झूठा}, {आईडी: ऑब्जेक्टआईडी ('543399f9964ac60915ceba8c'), अनुमोदित: झूठा}]}) ** यह क्या हो सकता है? मैंने आपकी डॉट एनोटेशन का उपयोग किया - – sbaaaang

+0

@ सबाआंग आप वास्तव में क्या कर रहे हैं? क्या आप "डॉट नोटेशन" फॉर्म का उपयोग कर रहे हैं जैसा आपको बताया गया था? बीटीडब्ल्यू स्पष्ट रूप से यह दिखाने के लिए धन्यवाद कि आपका वास्तविक डेटा आपके द्वारा पोस्ट किए गए तरीके से अलग है जो शायद यहां समस्या का हिस्सा है। कृपया अपनी वास्तविक डेटा संरचना को दिखाने के लिए संपादित करें। –

+0

हाँ * डॉट नोटेशन * का उपयोग करके, जैसा कि आपने कहा था, हाँ मैं ऑब्जेक्ट आईडी का उपयोग कर रहा हूं लेकिन ठीक है, मुझे लगता है कि समस्या नहीं है: पी नहीं? (संपादित प्रश्न) – sbaaaang

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();    
    }); 
संबंधित मुद्दे