Ce que vous essayez de faire n'est pas possible car il n'y a pas d'instruction de jointure sur mongodb.
Vous pouvez y parvenir de deux manières :
1 - Par DBRefs : Changez votre schéma en un schéma qui inclut toutes les informations utilisateur et ne les divisez pas en deux schémas différents comme vous le faites, voir dénormalisé . Ensuite, vous pouvez utiliser la Population fonction pour obtenir toutes les données des personnes.
2 - Par références manuelles : La deuxième solution consiste à effectuer un deuxième appel à la base de données en obtenant les données personProfile en utilisant l'ID utilisateur comme filtre.
Exemple 1 :
De cette façon, vous pouvez obtenir toutes les données des personnes sans un deuxième appel à la base de données.
var personSchema = Schema({
_id : Number,
name : String,
birthday: Date,
profilelink: String,
email: String
});
var storySchema = Schema({
_creator : { type : Schema.Types.ObjectId, ref: 'Person' },
title : String
});
Story
.find()
.populate(['_creator'])
.exec(function(err, stories) {
//do your stuff here
}
Notez que j'utilise le type Schema.Types.ObjectId et non le Numéro . De cette façon, vous pouvez attribuer une nouvelle valeur à _creator en passant soit le _id ou l'objet personne et la mangouste convertira l'objet en son _id. Par exemple, vous pouvez poster quelque chose comme
{
_creator : {
_id : 123123123123,
name : 'Foo',
birthday: '0000-00-00',
profilelink: 'http://foo.bar',
email: '[email protected]'
},
title : 'Mr'
}
... et la mangouste se convertira en
{
_creator : 123123123123,
title : 'Mr'
}
Exemple 2 :
De cette façon, vos données sont toujours normalisées et vous pouvez obtenir toutes les données des personnes avec un deuxième appel.
Story
.find()
.exec(function(err, stories) {
var arrayLength = stories.length;
for (var i = 0; i < arrayLength; i++) {
var story = stories[i];
personProfile.findById(story._creator, function (err, person) {
story._creator = person;
}
};
// do your stuff here
}