2017-09-01 1 views
3

Say, je Manager schéma:Mongoose plusieurs Remplit profondes

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

Et, je Client schéma:

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

Et Car et House (leur structure n'a pas d'importance pour la question Comment puis-je remplir en profondeur plusieurs champs Client dans l'appel .populate()?

Qu'ai-je essayé:

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

et il serait vraiment me surprendre si elle a travaillé (comme je l'ai Ecraser déclaré précédemment populate clé passée à la méthode .populate()). Mon exemple renvoie évidemment houses champ par utilisateur - celui qui vient en dernier. Honnêtement, aucune idée, rien dans le docs non plus. Est-ce même supporté? Je sais que c'est pour «peu profonde» peupler, basé sur mon exemple:

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

Qu'en est-il de la profondeur?

+1

Certes, c'est juste 'Users.populate ({chemin: 'utilisateurs de, peupleront: {chemin: « voitures maisons '}}) '. Être ''cars houses' 'comme la liste des chemins délimités par un espace dans le niveau actuel. Au moins c'est vrai pour un seul niveau, donc ça devrait sûrement être la même chose pour n'importe quoi d'autre. –

+0

Merci, ça aide. Ai-je oublié une explication dans les docs? – wscourge

+1

La liste délimitée par des espaces est mentionnée quelque part au début de la documentation. Il remplace le '.populate(). Populate()' que vous avez mentionné. –

Répondre

0

1) Passer un tableau d'objets avec des propriétés à être renseignés:

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

Cette solution permet d'utiliser remplir en profondeur dans toute son étendue. Considérez:

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

2) chaîne passe de collections séparées par des espaces à population:

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