113 votes

Mongoose : population profonde (remplir un champ peuplé)

J'ai Category modèle :

Category:
    ...
    articles: [{type:ObjectId, ref:'Article'}]

Le modèle d'article contient une référence à Account model .

Article:
    ...
    account: {type:ObjectId, ref:'Account'}

Donc, avec des personnes articles La catégorie modèle sera :

{ //category
    articles: //this field is populated
     [ { account: 52386c14fbb3e9ef28000001, // I want this field to be populated
         date: Fri Sep 20 2013 00:00:00 GMT+0400 (MSK),
         title: 'Article 1' } ],
    title: 'Category 1' }

La question est la suivante : comment remplir le sous-zone (compte) d'une zone remplie ([articles]) ? Voici comment je le fais maintenant :

globals.models.Category
    .find
        issue : req.params.id
        null
        sort:
            order: 1
    .populate("articles") # this populates only article field, article.account is not populated
    .exec (err, categories) ->
        console.log categories

Je sais que ça a été discuté ici : Mongoose : Remplir un champ rempli mais aucune solution réelle n'a été trouvée

249voto

techyaura Points 2040

Tout d'abord, mettez à jour la mangouste 3 vers 4 et utilisez ensuite la méthode la plus simple pour la population profonde dans la mangouste comme indiqué ci-dessous :

Supposons que vous avez un schéma de blog ayant userId comme ref Id et ensuite dans User vous avez une revue comme ref Id pour le schéma Review. Donc, fondamentalement, vous avez trois schémas :

  1. Blog
  2. Utilisateur
  3. Examen

Et, vous devez demander à partir du blog, quel utilisateur possède ce blog et la revue de l'utilisateur. Ainsi, vous pouvez demander votre résultat comme :

BlogModel
  .find()
  .populate({
    path : 'userId',
    populate : {
      path : 'reviewId'
    }
  })
  .exec(function (err, res) {

  })

48voto

Lucas Points 453

Remplissage à plusieurs niveaux

Supposons que vous ayez un schéma d'utilisateur qui garde la trace des amis de l'utilisateur.

var userSchema = new Schema({
  name: String,
  friends: [{ type: ObjectId, ref: 'User' }]
});

Populate vous permet d'obtenir une liste des amis d'un utilisateur, mais que se passe-t-il si vous voulez également connaître les amis des amis d'un utilisateur ? Spécifiez l'option populate pour demander à la mangouste de remplir le tableau des amis de tous les amis de l'utilisateur :

User.findOne({ name: 'Val' }).populate({
    path: 'friends',
    // Get friends of friends - populate the 'friends' array for every friend
    populate: { path: 'friends' }
});

Référence : http://mongoosejs.com/docs/populate.html#deep-populate

26voto

DestyNova Points 486

Mongoose a maintenant une nouvelle méthode Model.populate pour des associations profondes :

https://github.com/Automattic/mongoose/issues/1377#issuecomment-15911192

23voto

Buu Nguyen Points 19391

C'est peut-être un peu trop tard, mais j'ai écrit un Plugin Mongoose pour effectuer un peuplement profond à n'importe quel niveau imbriqué arbitraire. Avec ce plugin enregistré, vous pouvez peupler les articles et les comptes d'une catégorie avec une seule ligne :

Category.deepPopulate(categories, 'articles.account', cb)

Vous pouvez également spécifier remplir les options pour contrôler des choses comme limit , select ... pour chaque chemin rempli. Consultez la documentation du plugin pour plus d'informations.

12voto

Ravi Singh Points 653

Ou vous pouvez passer l'objet à la méthode populate comme :

const myFilterObj = {};
const populateObj = {
                path: "parentFileds",
                populate: {
                    path: "childFileds",
                    select: "childFiledsToSelect"
                },
                select: "parentFiledsToSelect"
               };
Model.find(myFilterObj)
     .populate(populateObj).exec((err, data) => console.log(data) );

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X