2016-03-12 9 views
6

कल्पना कीजिए मैं निम्नलिखित मॉडल:नेवला populating पथ

# MODEL A 
schemaA = mongoose.Schema 
    _bId: 
     type: mongoose.Schema.Types.ObjectId 
     ref: "B" 

# MODEL B 
schemaB = mongoose.Schema 
    _cId: 
     type: mongoose.Schema.Types.ObjectId 
     ref: "C" 
    _dId: 
     type: mongoose.Schema.Types.ObjectId 
     ref: "D" 

# MODEL C 
schemaC = mongoose.Schema 
    _eId: 
     type: mongoose.Schema.Types.ObjectId 
     ref: "E" 

मॉडल डी और ई किसी अन्य वस्तु के संदर्भ की जरूरत नहीं है और सुविधा की खातिर इसलिए अब सूचीबद्ध नहीं हैं।

सभी संदर्भों के साथ मॉडल "ए" को पॉप्युलेट करने का सबसे अच्छा अभ्यास क्या है? इस प्रकार वर्तमान में मैं इस कार्य को हल (यह एक उदाहरण-विधि क्योंकि मैं इसे अक्सर जरूरत है):

schemaA.methods = 
    populateAll: (cb) -> 
     @ 
     .populate 
      path: "_bId" 
      model: "B" 
      populate: 
       path: "_cId" 
       model: "C" 
       populate: 
        path: "_eId" 
        model: "E" 
     , (error) => 
      return cb error, @ if error? 
      D.findById @._bId._dId 
      .exec (error, d) => 
       return cb error, @ if error? 

       @._bId._dId = d 
       return cb error, @ 

यही एक रास्ता है मैं सभी संदर्भ क्योंकि उसके बाद फिर से कई रास्तों के साथ कई रास्तों को आबाद करने पॉप्युलेट करने के लिए मिल गया है विभिन्न मॉडलों में काफी मुश्किल है। मैं पहले से ही नीचे से एक की तरह एक समाधान की कोशिश की लेकिन के रूप में एक कल्पना कर सकते हैं, यह केवल पिछले आबादी के ऊपर लिख होगा:

@ 
.populate 
    path: "_bId" 
    model: "B" 
    populate: 
     path: "_cId" 
     model: "C" 
     populate: 
      path: "_eId" 
      model: "E" 
.populate 
    path: "_bId" 
    model: "B" 
    populate: 
     path: "_dId" 
     model: "D" 

उत्तर

2
@ 
    .populate 
     path: "_bId" 
     model: "B" 
     populate: [ 
      { 
       path: "_cId" 
       model: "C" 
       populate: 
        path: "_eId" 
        model: "E" 
      } 
      { 
       path: "_dId" 
      } 
     ] 
    , (error) => 

यह समाधान पूरी तरह से ठीक काम करता है और मैं सिर्फ इस बारे में पता चला।