2012-12-19 11 views
5

मेरे पास निम्न स्कीमा है।मोंगोस में आभासी विधि में संदर्भ फ़ील्ड को कैसे पॉप्युलेट करें?

var ItemSchema = new Schema({ 
name : String 
,location: { 
    address: { type: String, default:''}, 
    geolocation: {longitude: Number, latitude:Number}, 
    place : {type: Schema.Types.ObjectId, ref:'Place'} 
}, 
ranking_in_place : Number }) 

स्थान प्लेस स्कीमा का संदर्भ है जिसमें नाम, शहर, देश आदि फ़ील्ड हैं।

मैं ranking_summary के लिए एक आभासी बनाना चाहते हैं:

ItemSchema.virtual('ranking_summary').get(function() { 
    if(this.ranking_in_place <= 5){ 
     if(this.ranking_in_place == 1){ 
      return "Most popular item" + " in " + this.location.place.name 
     } 
    } 
}) 

मैं this.location.place.name मूल्य क्योंकि this.location.place एक संदर्भ है, और आबादी नहीं नहीं मिल सकता है। मैं इस मूल्य का उपयोग कैसे कर सकता हूं?

उत्तर

2

क्या आपने अपने प्रश्नों पर .populate() पर कॉल करना सुनिश्चित किया है? अन्यथा, मोंगोस संदर्भ वस्तु में खींचने के लिए नहीं जान पाएंगे। उदाहरण:

ItemModel.findOne().populate('place').exec(function (err, item) { 
    console.log(item.ranking_in_place) 
}) 
+0

मुझे यह बिल्कुल नहीं मिलता है। क्या पहले 'कॉलऑन' को कॉल किए बिना विधि को कॉल करना संभव नहीं है? – Joe

+0

हाँ ... वास्तव में सवाल इम्हो का जवाब नहीं दे रहा है। विशेष रूप से वर्चुअल के बारे में पूछना। –

1
Model.find().populate(path, fields, conditions, options); 

तो विकल्प के लिए आप

{ sort: 'order' } // ascending 
{ sort: [['order', 1 ]] } // ascending 
{ sort: [['order', 'asc' ]] } // ascending 
{ sort: [['order', 'desc' ]] } // ascending 
{ sort: [['order', -1 ]] } // descending 
{ sort: [['order', 'desc' ]] } // descending 
{ sort: [['order', 'descending' ]] } // descending 
+0

यह विधि बहुत धीमी है –

0

मुझे लगता है कि ऐसा करने के लिए कोई सीधा तरीका है इस्तेमाल कर सकते हैं। एक तरीका यह है कि आप इसे प्राप्त कर सकते हैं हुक का पालन करके। [Read More]

यहां एक नमूना कोड है। मुझे ट्यूटोरियल के कुल समय की गणना करने की आवश्यकता थी जो वीडियो से बना है। इसलिए, मुझे वीडियो पॉप्युलेट करना था और फिर ट्यूटोरियल के लिए कुलटाइम की गणना करने के लिए अपनी अवधि का उपयोग करना पड़ा।

tutorialSchema.pre('findOne', function (next) { 
    this.populate('videos'); // now available as this.ratings in this schema 
    next(); 
}); 

tutorialSchema.virtual('totalTime').get(function() { 
    let times = []; 
    times = this.videos.map((v) => { 
     return v.duration; 
    }); 
    if(times.length === 0) return 0; 
    let totalTime = times.reduce((sum, time) => { 
     return sum + time; 
    }); 
    return totalTime; 
});