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;
  });
});