Mongoose: deep population (populate a populated field)

f1nn picture f1nn · Sep 18, 2013 · Viewed 62.7k times · Source

I have Category model:

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

Article model contains ref to Account model.

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

So, with populated articles Category model will be:

{ //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' }

The questions is: how to populate subfield (account) of a populated field ([articles])? Here is how I do it now:

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

I know it was discussed here: Mongoose: Populate a populated field but no real solution was found

Answer

techyaura picture techyaura · Oct 5, 2016

Firstly, update mongoose 3 to 4 & then use the simplest way for deep population in mongoose as below :

Suppose you have Blog schema having userId as ref Id & then in User you have some review as ref Id for schema Review. So Basically, you have three schema : 1. Blog 2. User 3. Review

And, you have to query from blog, which user owns this blog & the user review. So you can query your result as :

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

  })