2013-01-30 13 views
9

मुझे यकीन नहीं है कि नीचे नमूना स्कीमा को कैसे पॉप्युलेट करना है या यदि यह भी संभव है। क्या संदर्भ नीचे की तरह किसी ऑब्जेक्ट के भीतर हो सकता है? यदि आप कर सकते हैं, तो आप इसे कैसे पॉप्युलेट करेंगे? जैसे .populate('map_data.location');?मोंगोस एक वस्तु के भीतर आबादी?

var sampleSchema = new Schema({ 
    name: String, 
    map_data: [{ 
    location: {type: Schema.Types.ObjectId, ref: 'location'}, 
    count: Number 
    }] 
}); 

या मैं स्थान के लिए दो अलग-अलग सरणियों है और गिनती तो तरह करना होगा:

// Locations and counts should act as one object. They should 
// Be synced together perfectly. E.g. locations[i] correlates to counts[i] 
locations: [{ type: Schema.Types.ObjectId, ref: 'location'}], 
counts: [Number] 

मैं पहली बार समाधान की तरह महसूस सबसे अच्छा होगा, लेकिन मैं पूरी तरह से यकीन है कि कैसे करने के लिए नहीं कर रहा हूँ इसे मोंगोस के भीतर काम करें।

किसी भी मदद के लिए बहुत बहुत धन्यवाद!

उत्तर

14

पहला समाधान संभव है।

नेवला वर्तमान सीमाओं (see this ticket here) एम्बेडेड दस्तावेजों के कई स्तरों को आबाद करने, तथापि बहुत एक एकल दस्तावेज़ के भीतर नेस्टेड रास्तों को समझने में अच्छा है - आप इस मामले में के बाद क्या कर रहे हैं।

उदाहरण वाक्य रचना होगा:

YourSchema.find().populate('map_data.location').exec(...)

ऐसे रास्तों पर getters/setters निर्दिष्ट करने के रूप में अन्य सुविधाओं, orderBy और जहां खंड, आदि भी एक नेस्टेड पथ, docs से इस उदाहरण की तरह स्वीकार करते हैं:

personSchema.virtual('name.full').get(function() { 
    return this.name.first + ' ' + this.name.last; 
}); 

आंतरिक रूप से मोंगोस डॉट्स पर स्ट्रिंग को विभाजित करता है और आपके लिए सबकुछ बाहर करता है।

+0

आपको बहुत बहुत धन्यवाद! –

+0

जहां तक ​​दूसरा बिंदु जाता है: क्या आपके पास शीर्ष तत्व है? यदि ऐसा है, तो सबकुछ एक top_id और parent_id दें। या वंशज सरणी और एक बच्चों की सरणी। फिर, ऊपर से सब कुछ ले लो, और ग्राहक पक्ष पर विरासत को हल करें। – Funkodebat

1

पहला विकल्प सबसे अच्छा है। "गिनती" ऑब्जेक्ट "map_data" का हिस्सा है।

4

पहले विकल्प ठीक है, लेकिन अगर किसी को उस क्वेरी map_data.location में समस्याएं आ रही हैं - नेवला खाली सरणी देता है वस्तु के स्थान पर - मैंने पाया कि यह काम करेगा:

.populate({ 
    path: 'map_data.location', 
    model: 'Location' 
}) 
संबंधित मुद्दे