2017-09-01 168 views
3

說,我Manager模式:貓鼬多深填充

{ 
    name: { type: String }, 
    clients: [{ type: Mongoose.Schema.ObjectId, ref: 'Client'}] 
} 

而且,我有Client模式:

{ 
    name : { type String }, 
    cars : [{ type: Mongoose.Schema.ObjectId, ref: 'Car' }], 
    houses: [{ type: Mongoose.Schema.ObjectId, ref: 'House' }] 
} 

而且CarHouse以及(它們的結構是不是這件事很重要。如何深度填寫多個Client的單個域名爲.populate()

什麼有我想:

Manager.find() 
    .populate({ 
     path: 'users', 
     populate: { path: 'cars' }, 
     populate: { path: 'houses' } 
    }); 

,如果它的工作(如我覆蓋之前宣佈populate鍵傳遞給.populate()方法),這將真正讓我感到吃驚。我的例子顯然會返回每個用戶填充的houses字段 - 最後一個字段。老實說,不知道,在docs也沒有。它甚至支持?我知道這是基於我的示例的「淺」填充:

User.populate('cars') 
    .populate('houses') 

那麼深的那個呢?

+1

當然這只是'Users.populate({路徑: '用戶',填入:{路徑:「汽車房屋'}})'。作爲「汽車之家」,由於空間限制了當前級別的路徑列表。至少對於單個級別來說這是真的,所以對於其他任何事情肯定應該是一樣的。 –

+0

謝謝,它有幫助。我忽略了文檔中的解釋嗎? – wscourge

+1

在文檔開始的某個地方提到空格分隔列表。它取代你提到的'.populate()。populate()'。 –

回答

0

1)傳遞對象的具有屬性的陣列,以被填充:

Manager.find() 
    .populate({ 
     path : 'users', 
     populate: [ 
      { path: 'cars' }, 
      { path: 'houses' } 
     ] 
    }); 

該解決方案使用深填充到其最大程度。試想一下:

Manager.find() 
    .populate({ 
     path : 'users', 
     populate: [ 
      { path: 'cars' }, 
      { 
       path : 'houses', 
       populate: { 
        path : 'rooms', 
        populate: 'windows' 
       } 
      } 
     ] 
    }); 

2)空間分隔的集合傳遞字符串要填充:

Manager.find() 
    .populate({ 
     path : 'users', 
     populate: 'cars houses' 
    });