// This is a contrived example to demonstrate // storing data on one side of a relationship var PostSchema = new mongoose.Schema({ title: String, slug: String, contents: String, categories: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Category' }] }); var Post = mongoose.model('Post', PostSchema); var CategorySchema = new mongoose.Schema({ name: String }); var Category = mongoose.model('Category', CategorySchema); // easy to get the categories for a post... Post.find().populate('categories').exec(function(err, posts) { // you have posts with categories }); // but harder to get the posts for a category. Category.find().populate('posts').exec(function(err, categories) { // handle err async.forEach(categories, function(category, done) { Post.find().where('categories').in([category.id]).exec(function(err, posts) { category.posts = posts; done(err); }); }, function(err) { // ... you have categories with posts }); });