2012-09-27 7 views
5

सादगी के sakes के लिए के साथ, यह मानते हुए की ये मेरे संग्रह स्कीमा हैं सरल उदाहरण:नेवला/MongoDB - एक दस्तावेज वस्तु सरणी जोड़कर, एक पूर्व निर्धारित स्कीमा

var MessageDeliverySchema = new Schema({ 
    from : { type : String }, 
    to  : { type : String }, 
    status : { type : String } 
}); 

var Messages = mongoose.model('messages', 
new Schema({ 
    id    : ObjectId, 
    user   : { type:String }, 
    'sent-messages' : [MessageDeliverySchema] 
})); 

तो संग्रह में प्रत्येक दस्तावेज़ संदेश में संदेश/eliverySchema द्वारा परिभाषित 4/5 भेजे गए संदेश हो सकते हैं।

मुझे क्या करना चाहते हैं भेजा-संदेशों की एक सरणी है, तो हर बार एक डिलीवरी रसीद में मैं सिर्फ संदेश अद्यतन और एक अन्य भेजे गए संदेश संलग्न आता है।

मैं क्या कोशिश की है:

var delivered = { 
from: 'foo', 
to: 'bar', 
status: 'delivered' 
}; 

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$pushAll: { 'sent-messages' : delivered }} , {upsert:true}, function(err, data) { 

}); 

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
}); 

$ pushAll, और $ धक्का, भेजा-संदेशों करने के लिए एक नई वस्तु संलग्न नहीं है, बजाय इसे एक मौजूदा संदेश अधिलेखित कर देता है।

क्या मैं देखना चाहता हूँ भेजे गए संदेश, उदा, की एक सरणी है:

{ 
    'sent-messages': [ 
     { 
      from: 'foo', 
      to: 'bar', 
      status: 'delivered' 
     }, 
     { 
      from: 'pippo', 
      to: 'pippo', 
      status: 'delivered' 
     }, 
     { 
      from: 'paul', 
      to: 'smith', 
      status: 'undelivered' 
     } 
    ] 
} 
+0

'$ push' सही ऑपरेटर का उपयोग करने के लिए है और अपने कोड ठीक काम किया जब मैं इसे करने की कोशिश:

संदर्भ के लिए यह एक मौजूदा दस्तावेज़ को संलग्न करने का सही तरीका, और मेरे सवाल का जवाब है । प्रत्येक बार जब मैंने इसे चलाया तो एक नया 'भेजा गया संदेश' सरणी तत्व जोड़ा गया था। – JohnnyHK

+0

@ जॉनीनीएचके आह, ठीक है, इसलिए यह मौजूदा संदेश को ओवरराइट नहीं कर रहा था। मुझे त्रुटि मिल रही है: '$ पुश/$ push लागू नहीं कर सकता है गैर-सरणी में सभी संशोधक'। – StuR

+1

मतलब यह है कि उस दस्तावेज़ में 'प्रेषित संदेश' संपत्ति जो पहले से ही डेटाबेस में है, एक सरणी नहीं है, इसलिए इसे धक्का नहीं दिया जा सकता है। शायद आपने उस अन्य माध्यमों के माध्यम से उस दस्तावेज़ को जोड़ा है, इसलिए यह आपके मोंगोस स्कीमा से मेल नहीं खाता है। – JohnnyHK

उत्तर

9

त्रुटि मैं हो रही थी था: '$ धक्का लागू नहीं कर सकता/गैर सरणी के लिए $ pushAll संशोधक'।

मैं इस तरह दस्तावेज़ में एक वस्तु कहा:

Message.update({_id: '5064aae4154cb34d14000001' }, 
      { 'sent-messages' : delivered }, function(err, data) { 
    }); 

और फिर एक $ धक्का करने की कोशिश की है, जो मुझे उपरोक्त त्रुटि दे दी है।

इसलिए मैंने दस्तावेज़ हटा दिया और वांछित प्रभाव वाले $ पुश का उपयोग किया।

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
}); 
संबंधित मुद्दे