• Stars
    star
    469
  • Rank 93,595 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 10 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Mongoose plugin to enable deep population of nested models ⛺

Mongoose plugin to enable population of nested models at any level of depth. Support Mongoose 3.8.x and later. Refer to changelog for breaking changes.

NPM

Build Status Code Shelter

Usage

Sample usages are based on the following schemas:

var UserSchema = new Schema({})

var CommentSchema = new Schema({
  user  : {type: Number, ref: 'User'}
})

var PostSchema = new Schema({
  user    : {type: Number, ref: 'User'},
  comments: [{type: Number, ref: 'Comment'}],
  likes   : [{user: {type: Number, ref: 'User'}}],
  approved: {status: Boolean, user: {type: Number, ref: 'User'}}
})

Register plugin

// CHANGE from 1.x: need to pass in mongoose instance
var deepPopulate = require('mongoose-deep-populate')(mongoose);
PostSchema.plugin(deepPopulate, options /* more on options below */);

Perform population

On Post model:

// Use callback
Post.deepPopulate(posts, 'comments.user', function (err, _posts) {
  // _posts is the same instance as posts and provided for convenience
  posts.forEach(function (post) {
    // post.comments and post.comments.user are fully populated
  });
});

// Use promise
Post.deepPopulate(posts, 'comments.user').then(...);

On an instance of Post:

// Use callback
post.deepPopulate('comments.user', function (err, _post) {
  // _post is the same instance as post and provided for convenience
});


// Use promise
post.deepPopulate('comments.user').then(...);

On Query (returns the same query object to chain):

Post.find().deepPopulate('comments.user').exec(function (err, posts) { ... });
Post.findOne().deepPopulate('comments.user').exec(function (err, post) { ... });
Post.findById(id).deepPopulate('comments.user').exec(function (err, post) { ... });

Populate multiple paths

Pass paths in a space- or comma-delimited string:

post.deepPopulate('user comments.user likes.user approved.user', cb);

Or use an array of strings:

post.deepPopulate(['comments.user', 'user', 'likes.user', 'approved.user'], cb);

Specify options

Specify whitelist option to ensure only certain paths can be populated. This is to prevent potential performance and security issues if you allow API clients to supply population paths.

PostSchema.plugin(deepPopulate, {
  whitelist: [
    'user',
    'comments.user'
  ]
});

Use the populate option to supply paths with corresponding Mongoose populate options.

PostSchema.plugin(deepPopulate, {
  populate: {
    'comments.user': {
      select: 'name',
      options: {
        limit: 5
      }
    },
    'approved.user': {
      select: 'name'
    }
  }
});

Use rewrite option to rewrite provided paths as well as paths in whitelist and populate. This is useful when you allow API clients to supply population paths (e.g. via query string) and want to make these paths more user-friendly. For example:

PostSchema.plugin(deepPopulate, {
  rewrite: {
    author: 'user',
    approver: 'approved.user'
  }
});

// assume the query string is: ?populate=author,approver
post.deepPopulate(req.query.populate, cb);  
Overriding options

You can override the above plugin options when invoking deepPopulate.

Post.deepPopulate(posts, paths, {
  whitelist: [],
  populate: {},
  rewrite: {}
}, cb)

post.deepPopulate(paths, {
  whitelist: [],
  populate: {},
  rewrite: {}
}, cb);

Post.find({}).deepPopulate(paths, {
  whitelist: [],
  populate: {},
  rewrite: {}
}).exec(cb)

Test

The test suite will drop the database each run, so only run it against a test database. To run tests, execute this command where --db is the connection string.

gulp test --db mongodb://127.0.0.1/mongoose_deep_populate_test_db

Changelog

v3.2.0

  • [Bug] Support async callback #70

v3.1.1

  • [Bug] Fix issue custom Promise not work in Mongoose 5

v3.1.0

  • [Feature] Support Mongoose 5

v3.0.0

  • [Feature] Return a promise when invoking deepPopulate() on model or model instance.

v2.0.3

  • [Bug] Fix bug cannot use native ES6 Promise

v2.0.2

  • [Bug] Fix bug populating when there is a subdocument within a linked document (see #29)

v2.0.0

  • [Breaking] Need a mongoose instance passed to the function returned by require
  • [Feature] Support mongoose promise provider

v1.1.0

  • [Feature] Make mongoose a peer dependency to enforce supported versions

v1.0.2

  • [Bug] Fix bug happening when Mongoose#populate does not infer the expected schema

v1.0.1

  • [Bug] Apply lean to populated documents

v1.0.0

  • [Feature] Apply rewrites to whitelist and populate

v0.0.7

  • [Feature] Add deepPopulate to Query
  • [Feature] Support space delimiter in paths

v0.0.6

  • [Feature] Support populate options
  • [Feature] Override options per call
  • [Bug] Handle null paths and callback

v0.0.1

  • Initial release

License

MIT

More Repositories

1

topbar

Tiny & beautiful site-wide progress indicator
CSS
436
star
2

fasterflect

.NET Reflection Made Fast and Simple ⛺
C#
283
star
3

redux-freeze

Redux middleware that prevents state from being mutated anywhere in the app
JavaScript
213
star
4

combres

ASP.NET and MVC performance optimization library ⛺
C#
123
star
5

route-decorators

ES7 decorators that simplify Koa and Express route creation
JavaScript
75
star
6

esql

Humane query language for Elasticsearch ⛺
JavaScript
50
star
7

memento

Lightweight and extensible undo framework for .NET ⛺
C#
33
star
8

bike

Cross-platform, CLR-based programming language
C#
29
star
9

exif-orient

Library to orient images based on their Exif orientation ⛺
JavaScript
21
star
10

koa-req-validator

Declarative request validation middleware for Koa
JavaScript
19
star
11

redux-validate-fsa

Redux middleware that validates if an action is a Flux Standard Action (FSA).
JavaScript
16
star
12

notify

Change tracking library for .NET ⛺
C#
13
star
13

jundo

JavaScript Undo Library ⛺
JavaScript
11
star
14

jcr

jQuery Carousel ⛺
HTML
7
star
15

cordova-photo-library

Cordova plugin to save images and videos to photo library ⛺
Objective-C
5
star
16

misc-js

Miscellaneous JavaScript
JavaScript
4
star
17

local-server

Minimal static server
JavaScript
3
star
18

spotify-importer

Import local music library to Spotify
JavaScript
3
star
19

evtify

Event emitter for Node & browser ⛺
JavaScript
2
star
20

grunt-mindirect

Grunt task to perform in-place JS minification
JavaScript
1
star
21

metronome

Simple metronome
HTML
1
star
22

qtrace-samples

Sample code for qTrace publishers
C#
1
star