NodeJS Mongoose Population
Population
There are no joins in MongoDB but sometimes we still want references to documents in other collections.
This is where population comes in
Guide
ref
_author : { type: Number, ref: 'User' }
Example
var mongoose = require(''); var Schema = mongoose.Schema; var userSchema = Schema({ _id : Number, name : String, age : Number, blogs : [{ type: Schema.Types.ObjectId, ref: 'Blog'}] }); var blogSchama = Schema({ _creator : { type: Number, ref: 'User'}, title : String, body : String }); var Blog = mongoose.model('Blog', blogSchama); var User = mongoose.model('User', userSchema);
Saving refs
var user1 = new User({ _id: 0, name: 'Alice', age: 17}); user1.save(function(err) { if (err) return; }); var blog1 = new Blog({ title : "Today", _creator: user1._id }); blog1.save(function(err) { if (err) return; });
Population
Retrieve ref
Get User from Blog
Blog.findOne({title: 'Today'}) .populate('_creator') .exec(function(err, blog) { console.log('The crator is %s', blog._creator.name); });
We can use field selection of population
.populate('_creator', 'name') // name only
Query condition
.populate(‘_creator’, ‘name’) // name only
.populate({ match: {age: {$gte: 20}}, options: {limit: 5} });
Refs
user.blogs.push(blog); user.save(function(err){ });
Saving refs
var user = new User({_id: 0, name: 'Tifa', age: 19}); user.save(function(err) { if (err) return; var blog = new Blog({ title: '', _creator: user._id }); blog.save(function(err) { if (err) return; }); });