Recherche…


Syntaxe

  1. 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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow