// This is how you could use Keystone's features to simplify // managing the relationship. Posts have gained authors. var Post = new keystone.List({ autokey: { path: 'slug', from: 'title', unique: 'true' } }).add({ title: String, contents: keystone.Types.Markdown, author: { type: keystone.Types.Relationship, ref: 'User' }, categories: { type: keystone.Types.Relationship, ref: 'Category', many: true } }); Post.register(); var Category = new keystone.List().add({ name: String }); Category.relationship({ path: 'posts', ref: 'Post', refPath: 'categories' }); Category.register(); // we can populate categories on posts using mongoose's populate Post.model.find().populate('categories').exec(function(err, posts) { /* ... */ }); // there's one more step, but we can use keystone's populateRelated to achieve a similar effect for posts in categories Category.model.find().exec(function(err, categories) { keystone.populateRelated(categories, 'posts', function(err) { // ... you have categories with posts }); }); // if you've got a single document you want to populate a relationship on, it's neater Category.model.findOne().exec(function(err, category) { category.populateRelated('posts', function(err) { // posts is populated }); }); // if you also wanted to populate the author on the posts loaded for each category, // you can do that too - it uses mongoose's populate method because the relationship // is stored in a path on the Post Category.model.findOne().exec(function(err, category) { category.populateRelated('posts[author]', function(err) { // posts is populated, and each author on each post is populated }); });