mongoose
Population de Mongoose
Recherche…
Syntaxe
- Model.Query.populate (path, [select], [model], [match], [options]);
Paramètres
| Param | Détails |
|---|---|
| chemin | String - La clé de champ à remplir |
| sélectionner | Object, String - Sélection de champ pour la requête de population. |
| modèle | Modèle - Instance du modèle référencé |
| rencontre | Object - Remplir les conditions |
| options | Object - Options de requête |
Peupler simple
Mongoose populate est utilisé pour afficher les données des documents référencés provenant d'autres collections.
Disons que nous avons un modèle Person qui a référencé des documents appelés Address .
Modèle de personne
var Person = mongoose.model('Person', {
fname: String,
mname: String,
lname: String,
address: {type: Schema.Types.ObjectId, ref: 'Address'}
});
Modèle d'adresse
var Address = mongoose.model('Address', {
houseNum: String,
street: String,
city: String,
state: String,
country: String
});
Pour renseigner Address inside Person utilisant ObjectId, en utilisant disons findOne() , utilisez la fonction populate() et ajoutez l' address de la clé de champ comme premier paramètre.
Person.findOne({_id: req.params.id})
.populate('address') // <- use the populate() function
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
Ou
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address');
La requête ci-dessus doit produire le document ci-dessous.
Personne doc
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":"456def" // <- Address' Id
}
Adresse Doc
{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
Doc peuplé
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Négliger quelques champs
Disons que vous ne voulez pas que les champs houseNum et street houseNum dans le champ d' address du document final rempli, utilisez le populate() comme suit,
Person.findOne({_id: req.params.id})
.populate('address', '-houseNum -street') // note the `-` symbol
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
Ou
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', '-houseNum -street'); // note the `-` symbol
Cela produira le document final final suivant,
Doc peuplé
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"city":"City of the dead",
"state":"AB",
"country:"PH"
}
}
Ne remplir que quelques champs
Si vous ne voulez que les champs houseNum et street dans le champ d' address du document final rempli, utilisez la fonction populate() comme suit dans les deux méthodes ci-dessus,
Person.findOne({_id: req.params.id})
.populate('address', 'houseNum street')
.exec(function(err, person) {
// do something.
// variable `person` contains the final populated data
});
Ou
Person.findOne({_id: req.params.id}, function(err, person) {
// do something
// variable `person` contains the final populated data
})
.populate('address', 'houseNum street');
Cela produira le document final final suivant,
Doc peuplé
{
"_id":"123abc",
"fname":"John",
"mname":"Kennedy",
"lname":"Doe",
"address":{
"_id":"456def",
"houseNum":"2",
"street":"Street 2"
}
}
Population imbriquée
Disons que vous avez un schéma d' user , qui contient le name , le contactNo , l' address et les friends .
var UserSchema = new mongoose.Schema({
name : String,
contactNo : Number,
address : String,
friends :[{
type: mongoose.Schema.Types.ObjectId,
ref : User
}]
});
Si vous voulez trouver un utilisateur, ses amis et amis d'amis , vous devez faire la population sur 2 niveaux, à savoir la population imbriquée .
Pour trouver des amis et des amis d'amis:
User.find({_id : userID})
.populate({
path : 'friends',
populate : { path : 'friends'}//to find friends of friends
});
Tous les parameters et options de populate peuvent également être utilisés à l'intérieur du peuplement imbriqué pour obtenir le résultat souhaité.
De même, vous pouvez populate plus de levels fonction de vos besoins.
Il n'est pas recommandé de faire de la population imbriquée pour plus de 3 niveaux. Si vous devez effectuer un remplissage imbriqué sur plus de 3 niveaux, vous devrez peut-être restructurer votre schéma.