nullfox
nullfox

Reputation: 607

Automatically populate() on Mongoose document fetch

Is it possible to automatically run populate() for referenced subdocuments for a particular model?

I have a City model that has referenced Region and Country documents that I would like to be automatically populated when a city/cities are fetched.

Upvotes: 3

Views: 1885

Answers (2)

shaond
shaond

Reputation: 554

AFAIK there's no way to auto-populate all references to another model out of the box (there are plugins though). In a similar fashion to @gustavohenke's answer you can use a static, along with a small change to your find query.

Here's what I'd do:

citySchema.statics.fieldsToPopulate = function() {
   return ['regionField', 'countryField'];
};

Where regionField and countryField are the fields which reference the models Region and Country respectively.

Then in your query you could populate accordingly:

var populate = city.fieldsToPopulate ? city.fieldsToPopulate() : [];

city.findById(id)
   .populate(populate)
   .exec(function(err, data) {
      if (err) {
        return next(err);
      } else {
        res.render('template', { city: data });
      }
    });

Upvotes: 0

gustavohenke
gustavohenke

Reputation: 41440

Well, there aren't docs for this in the Mongoose website; what I do is something like this:

schema.statics.createQuery = function( populates ) {
   var query = this.find();
   populates.forEach(function( p ) {
       query.populate( p );
   });

   return query;
};

Of course, there is validation and some other stuff in this method, but essentially it's what I do with my models.

In your case, you could hard code the populates in such a method, if you strictly need them in every find call.

Upvotes: 1

Related Questions