2012-09-30 15 views
15

मैं MongoDB के लिए मेरे node.js एप्लिकेशन के साथ एक ओडीएम के रूप में मोंगोस का उपयोग शुरू करने की कोशिश कर रहा हूं। मैंने देखा है कि जब मैं एक एम्बेडेड दस्तावेज़ के साथ एक स्कीमा तैयार करता हूं कि यदि मैं इसमें कोई मान नहीं जोड़ता, तो यह मोंगो में एक खाली सरणी "[]" संग्रहीत करता है। ऐसा क्यों है? मैं रिकॉर्ड में ऐतिहासिक परिवर्तनों को संग्रहीत करने की कोशिश कर रहा हूं और एक खाली सरणी का अर्थ यह होगा कि उस परिवर्तन ने मूल्य हटा दिया। यहां एक नमूना स्कीमा है।मोंगोस खाली ऐरे क्यों जोड़ता है?

schema.Client = new mongoose.Schema({ 
    name:{type:String, required:true}, 
    products:[{ 
     name:{type:String, index:true}, 
     startDate:Date, 
     endDate:Date 
    }], 
    subdomain:{type:String, index:{unique:true}}, 
}) 

परिणामस्वरूप दस्तावेज़ है जब मैं केवल दस्तावेज़ और सबडोमेन के साथ दस्तावेज़ सहेजता हूं।

{ 
    "name": "Smith Company", 
    "products": [], 
    "subdomain": "smith" 
} 

डिफ़ॉल्ट रूप से यह रिक्त सरणी वाले उत्पादों को क्यों जोड़ता है और मैं इसे कैसे रोक सकता हूं?

+0

एक सरणी के लिए डिफ़ॉल्ट मान एक खाली सरणी है, तो आप केवल {नाम: "foo" उप डोमेन: "बार"} को बचाने अगर उत्पादों एक खाली सरणी होगी। – supernova

+0

क्या कोई सरणी के लिए डिफ़ॉल्ट मान बदलने का कोई तरीका है जिसके परिणामस्वरूप यह कुछ भी नहीं लिख रहा है? – wintzer

+0

क्या आप कोड पोस्ट कर सकते हैं जहां आप अपना दस्तावेज़ अपडेट करते हैं? – supernova

उत्तर

0

क्योंकि आपकी स्कीमा में आप उत्पादों को एक वस्तु के रूप में परिभाषित कर रहे हैं। आपको कुछ ऐसा करने की आवश्यकता होगी:

products: { 
     name:{type:String, index:true}, 
     startDate:Date, 
     endDate:Date 
    }, 

यह किसी सरणी के बजाय एक खाली ऑब्जेक्ट स्टोर करेगा।

+2

मैं इसे एक सरणी बनाना चाहता हूं, क्योंकि एक दस्तावेज़ में कई उत्पादों के संदर्भ हो सकते हैं। मैं डेटाबेस में कुछ भी लिखना नहीं चाहता हूं अगर मैं इसमें कोई डेटा नहीं डालता। – wintzer

+0

मुझे लगता है कि यह डेटाबेस में भी नहीं लिखा गया है - क्या आपने जांच की है? मेरे पास एक सरणी के बिना एक मॉडल था, और जब मैंने अभी ऑब्जेक्ट आईडी की एक सरणी जोड़ दी और '।इन मॉडल उदाहरणों में से एक को '.toJSON' ने प्रतिक्रिया में खाली सूची जोड़ दी है, भले ही मैंने डेटाबेस से लिखा नहीं है। – sol

12

खाली सरणी आपको अपने मॉडल से तत्व जोड़ने या निकालने का सुविधाजनक तरीका प्रदान करता है।

$push$addToSet$pull अपडेट में आपको अपने सरणी तत्वों को प्रबंधित करने में मदद मिलेगी।

आप एक खाली सरणी तो आप null

के तत्वों पुश नहीं कर सकता नहीं है, तो लेकिन यह खाली सरणी में संभव है।

+10

अभी भी ऐसे मामले हैं जहां आप "इस दस्तावेज़ के लिए अप्रासंगिक" के लिए एक विशेषता की कमी चाहते हैं। जब यह एक आम बात है, तो यह खाली अरणों का एक गुच्छा रखने के लिए एक बदसूरत अपशिष्ट है। ऐसा लगता है कि दस्तावेज़ डेटाबेस की सुंदरताओं में से एक को हराया जाता है, अर्थात् एक ही संग्रह में विभिन्न दस्तावेज़ संरचनाओं को स्टोर करने की क्षमता। मैं रिक्त सरणी के लिए क्षमता को देखना चाहता हूं जिसके परिणामस्वरूप दस्तावेज़ में कोई विशेषता नहीं है जब तक कि रिक्त सरणी स्पष्ट रूप से सहेजे जाने वाले मॉडल का हिस्सा न हो। यह भी सहज है। मोंगोडीबी में यह क्यों संभव नहीं है या यह एक स्पष्टीकरण। – neverfox

3

इस डिजाइन से हो रहा है, लेकिन वहाँ एक समाधान यहाँ एक 'पूर्व' हैंडलर का उपयोग कर डिफ़ॉल्ट खाली सरणी दूर करने के लिए है: https://github.com/LearnBoost/mongoose/issues/1335

यह केवल मेरे लिए काम किया जब मैं, null के क्षेत्र सेट हालांकि। यदि मैं नमूना कोड में undefined पर सेट करता हूं, तो खाली सरणी वापस आती है।

3

आप द्वारा वैकल्पिक हल कर सकते हैं नीचे की तरह स्कीमा निर्धारित:

products: { 
    type: [{ 
    name:String, 
    startDate:Date, 
    endDate:Date 
    }], 
    default: undefined 
} 
संबंधित मुद्दे