2016-03-12 18 views
6

Hãy tưởng tượng tôi có các mô hình sau:Mongoose populating con đường với nhiều subpath

# 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" 

Mẫu D và E không có bất kỳ tài liệu tham khảo đối tượng khác và vì lợi ích của sự thuận tiện do đó không được liệt kê được nữa.

Phương pháp hay nhất để điền mô hình "A" với tất cả các tham chiếu là gì? Hiện nay tôi giải quyết nhiệm vụ này như sau (đây là một ví dụ-phương pháp, vì tôi cần nó khá thường xuyên):

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, @ 

Đây là cách duy nhất tôi tìm thấy để cư tất cả các tài liệu tham khảo vì Populating nhiều đường với sau đó lại nhiều đường trong các mô hình khác nhau là khá khó khăn. Tôi đã cố gắng một giải pháp như hình dưới đây nhưng như người ta có thể tưởng tượng, nó chỉ sẽ ghi đè lên các quần thể theo thời gian:

@ 
.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" 

Trả lời

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

giải pháp này hoạt động hoàn toàn tốt đẹp và tôi chỉ phát hiện ra về việc này.

Các vấn đề liên quan