2017-03-29 1 views
0

Je voudrais utiliser la méthode populate dans Mongoose pour interroger une collection. Voici mon schéma:Comment peupler un champ d'une collection de frères et soeurs en utilisant Mongoose?

var UnitSchema = new Schema({ 
    name: { 
     type: String, 
     required: true 
    }, 
    unitNumber: Number, 
    members: [MemberSchema], 
    orgs: [OrgSchema] 
}); 

var MemberSchema = new mongoose.Schema({ 
    name: { 
     first: String, 
     last: String 
    }, 
    phone: String, 
    email: String 
}); 

var OrgSchema = new mongoose.Schema({ 
    name: { 
     type: String, 
     required: true 
    }, 
    sortIndex: Number, 
    roles: [RoleSchema] 
}); 

var RoleSchema = new mongoose.Schema({ 
    name: String, 
    sortIndex: Number, 
    member: { 
     type: Schema.Types.ObjectId, 
     ref: 'Member' 
    } 
}); 

Voici une collection exemple Unit:

{ 
    "_id": "58da7bd6e7092e8735646ba0", 
    "name": "Unit Name", 
    "orgs": [ 
     { 
      "name": "Org name", 
      "sortIndex": 0, 
      "_id": "58da7bd6e7092e8735646c2d", 
      "roles": [ 
       { 
        "name": "Role Name", 
        "sortIndex": 0, 
        "member": "58dbd1e6c9a893a7840472ad" 
       } 
      ] 
     } 
    ], 
    "members": [ 
     { 
      "name": { 
       "first": "First Name", 
       "last": "Last Name" 
      }, 
      "_id": "58dbd1e6c9a893a7840472ad" 
     } 
    ] 
} 

Comment puis-je remplir un Member doc au champ membre de la collection Roles donc ma sortie serait comme ceci:

[ 
    { 
     "name": "Org name", 
     "sortIndex": 0, 
     "_id": "58da7bd6e7092e8735646c2d", 
     "roles": [ 
      { 
       "name": "Role Name", 
       "sortIndex": 0, 
       "member": { 
        "name": { 
         "first": "First Name", 
         "last": "Last Name" 
        }, 
        "_id": "58dbd1e6c9a893a7840472ad" 
       } 
      } 
     ] 
    } 
] 

est la requête ici, je pensais:

Unit.findOne({unitNumber: unitNumber}).populate('roles.callings.member').exec(...) 

Répondre

1

Et voilà!

unit.findOne({unitNumber: 543}) 
.populate('orgs') 
.exec(function(err, unitDoc){ 
    var subDoc = unitDoc.orgs; 
    for(var org of subDoc){ 
     org.populate('roles', function(err, data){ 
      var rolesDoc = data.roles; 
      for(var role of rolesDoc){ 
       role.populate('member', function(err, rdata){ 
        console.log(JSON.stringify(unitDoc)); 
       }) 
      } 
     }) 
    } 
}) 

Vous devez remplir chaque sous-document comme indiqué ci-dessus.