hata-mongoose-deep-populate
v1.0.0
Published
A modification of mongoose-deep-populate plugin for working with multiple databases.
Downloads
7
Readme
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. (https://www.npmjs.com/package/mongoose-deep-populate)
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('hata-mongoose-deep-populate')(mongoose);
PostSchema.plugin(deepPopulate, options /* more on options below */);
Perform population
On Post
model:
// Use callback
Post.deepPopulate(posts, [{path: 'comments.user', model: [Comment.getModel(id), Usere.getModel(id)]}], 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, [{path: 'comments.user', model: [Comment.getModel(id), User.getModel(id)]}]).then(...);
On an instance of Post
:
// Use callback
post.deepPopulate([{path: 'comments.user', model: [Comment.getModel(id), User.getModel(id)]}], function (err, _post) {
// _post is the same instance as post and provided for convenience
});
// Use promise
post.deepPopulate([{path: 'comments.user', model: [Comment.getModel(id), User.getModel(id)]}]).then(...);
On Query
(returns the same query object to chain):
Post.find().deepPopulate([{path: 'comments.user', model: [Comment.getModel(id), User.getModel(id)]}]).exec(function (err, posts) { ... });
Post.findOne().deepPopulate([{path: 'comments.user', model: [Comment.getModel(id), User.getModel(id)]}]).exec(function (err, post) { ... });
Post.findById(id).deepPopulate([{path: 'comments.user', model: [Comment.getModel(id), User.getModel(id)]}]).exec(function (err, post) { ... });
Populate multiple paths
post.deepPopulate([{path: 'user', model: [User.getModel(id)]}, {path: 'comments.user', model: [Comment.getModel(id), User.getModel(id)]}, {path: 'likes.user', model: [null, User.getModel(id)]}, {path: 'approved.user', model: [null, User.getModel(id)]}], 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
v0.0.1
- Initial release
License
MIT