2012-11-29 22 views
9

तो मैं कैसे एक भी आभासी विशेषता पाने के लिए पता है, के रूप में नेवला डॉक्स में कहा गया है:वस्तुओं की एक सरणी में प्रत्येक नेस्टेड ऑब्जेक्ट के लिए वर्चुअल विशेषता प्राप्त करें?

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

लेकिन क्या होगा अगर मेरी स्कीमा है:

var PersonSchema = new Schema({ 
    name: { 
     first: String 
    , last: String 
    }, 

    arrayAttr: [{ 
     attr1: String, 
     attr2: String 
    }] 
}) 

और मैं के लिए एक आभासी विशेषता जोड़ना चाहते हैं सरणी में प्रत्येक नेस्टेड ऑब्जेक्ट:

PersonSchema.virtual('arrayAttr.full').get(function(){ 
    return attr1+'.'+attr2; 
}); 

लेमेम को पता है कि मुझे यहां कुछ याद आया है या नहीं।

उत्तर

0

सबसे पहले आप

बजाय this.some_attrsome_attr

लिखना चाहिए और आप this.attr acces नहीं कर सकते क्योंकि वहाँ arrayAttr में हैं। तो अगर आप उदाहरण के लिए कर सकते हैं:

this.arrayAttr[0].attr1 + "." + this.arrayAttr[0].attr2 

यह सुरक्षित है क्योंकि arrayAttr खाली

21

हो सकता है आप attrArray के तत्वों के लिए एक अलग स्कीमा को परिभाषित करने और जो स्कीमा के लिए आभासी विशेषता जोड़ने की जरूरत नहीं है।

var AttrSchema = new Schema({ 
    attr1: String, 
    attr2: String 
}); 
AttrSchema.virtual('full').get(function() { 
    return this.attr1 + '.' + this.attr2; 
}); 

var PersonSchema = new Schema({ 
    name: { 
     first: String 
    , last: String 
    }, 
    arrayAttr: [AttrSchema] 
}); 
+1

एक अतिरिक्त स्कीमा के बिना यह करने के लिए कोई रास्ता नहीं है? या मुझे कहना चाहिए, अतिरिक्त एम्बेडेड स्कीमा –

+0

@deusj मुझे नहीं पता कि, नहीं। – JohnnyHK

+0

कूल, उत्तर –

4

निश्चित रूप से, आप एक अतिरिक्त स्कीमा परिभाषित कर सकते हैं, लेकिन मोंगोज़ पहले से ही यह आपके लिए कर रहा है।

यह

PersonSchema.path('arrayAttr').schema 

में संग्रहीत किया जाता है तो आप इस स्कीमा

PersonSchema.path('arrayAttr').schema.virtual('full').get(function() { 
    return this.attr1 + '.' + this.attr2 
}) 
+0

के लिए धन्यवाद यदि 'arrayAttr' ऑब्जेक्ट्स की एक सरणी है। यह किस वस्तु का जिक्र है? या 'array' अब 'arrayAttr' के अंदर प्रत्येक ऑब्जेक्ट की एक नई विशेषता या कुंजी है? –

+1

पूर्ण प्रत्येक arrayAttr ऑब्जेक्ट पर एक नई वर्चुअल प्रॉपर्टी है। –

-1

इस के लिए मेरा पसंदीदा समाधान सीधे नेस्टेड स्कीमा संदर्भ के लिए है में जोड़कर एक आभासी सेट कर सकते हैं।

PersonSchema.paths.arrayAttr.schema.virtual('full').get(function() { 
    return this.attr1 + '.' + this.attr2; 
}); 

यह भी ध्यान रखना महत्वपूर्ण है कि आभासी डिफ़ॉल्ट रूप से मोंगोस स्कीमा द्वारा वापस नहीं आते हैं। इस प्रकार, नेस्टेड स्कीमा पर स्ट्रिंगफिकेशन गुण सेट करना सुनिश्चित करें।

var options = { virtuals: true }; 
PersonSchema.paths.arrayAttr.schema.set('toJSON', options); 
0

अगर आप चाहते हैं सब सरणी यहाँ तत्वों से एक गणना मूल्य एक उदाहरण है: करने के लिए

const schema = new Schema({ 
    name:   String, 
    points: [{ 
     p:  { type: Number, required: true }, 
     reason: { type: String, required: true }, 
     date: { type: Date, default: Date.now } 
    }] 
}); 

schema.virtual('totalPoints').get(function() { 
    let total = 0; 
    this.points.forEach(function(e) { 
     total += e.p; 
    }); 
    return total; 
}); 

User.create({ 
    name: 'a', 
    points: [{ p: 1, reason: 'good person' }] 
}) 

User.findOne().then(function(u) { 
    console.log(u.toJSON({virtuals: true})); 
}); 

रिटर्न:

{ _id: 596b727fd4249421ba4de474, 
    __v: 0, 
    points: 
    [ { p: 1, 
     reason: 'good person', 
     _id: 596b727fd4249421ba4de475, 
     date: 2017-07-16T14:04:47.634Z, 
     id: '596b727fd4249421ba4de475' } ], 
    totalPoints: 1, 
    id: '596b727fd4249421ba4de474' }