Search code examples
node.jsmongodbmongoose

Populate nested array in mongoose


How can I populate "components" in the example document:

  {
    "__v": 1,
    "_id": "5252875356f64d6d28000001",
    "pages": [
      {
        "__v": 1,
        "_id": "5252875a56f64d6d28000002",
        "page": {
          "components": [
            "525287a01877a68528000001"
          ]
        }
      }
    ],
    "author": "Book Author",
    "title": "Book Title"
  }

This is my JS where I get document by Mongoose:

  Project.findById(id).populate('pages').exec(function(err, project) {
    res.json(project);
  });

Solution

  • Mongoose 4.5 support this

    Project.find(query)
      .populate({ 
         path: 'pages',
         populate: {
           path: 'components',
           model: 'Component'
         } 
      })
      .exec(function(err, docs) {});
    

    And you can join more than one deep level.

    Edit 03/17/2021: This is the library's implementation, what it do behind the scene is make another query to fetch thing for you and then join in memory. Although this work but we really should not rely on. It will make your db design look like SQL tables. This is costly operation and does not scale well. Please try to design your document so that it reduce join.