Querying nested embedded documents with Mongoose
coffeescript, mongodb, mongoose, node.js
Solution
Deep population was added in Mongoose 3.6. https://github.com/LearnBoost/mongoose/issues/1377#issuecomment-15911192
For your example, it would be something like:
Owner.find().populate('shelves').exec(PopulateBooks);
function PopulateBooks(err, owners) {
if(err) throw err;
// Deep population is here
Book.populate(owners, { path: 'shelves.books' }).exec(callback);
}
Problem
I'm trying to query inside an embedded document that is nested. I've attempted to 'populate' the results but that fails. How do I get back all of the book details inside the find call? I want all of the book objects on a users shelf that I can get data from? ``` ### Trying to query nested embedded documents using Mongoose. Database Outline for example An Owner has multiple bookshelves which each have an array of books. A book is not unique, and the same book could be on many different shelves. ### mongoose = require("mongoose") Schema = mongoose.Schema mongoose.connect "localhost", "d1" bookSchema = new Schema(title: String) Book = mongoose.model("Book", bookSchema) shelfBookSchema = new Schema( book: type: Schema.ObjectId ref: "Book" ) shelfSchema = new Schema( name: String books: [ shelfBookSchema ] ) Shelf = mongoose.model("Shelf", shelfSchema) ownerSchema = new Schema( firstName: String shelves: [ shelfSchema ] ) Owner = mongoose.model("Owner", ownerSchema) mongoose.connection.on "open", -> book1 = new Book(title:"How to make stuff") book1.save (err) -> throw err if err owner = new Owner(firstName:"John") shelf = new Shelf(name:"DIY Shelf") shelf.books.push _id: book1._id book: book1._id owner.shelves.push shelf owner.save (err) -> throw err if err #Let's find one owner and get all of his bookshelves and the books they containa Owner.findOne().populate("shelves.books.book").exec (err, owner) -> console.error owner.shelves[0].books ### Log shows: { book: 4fe3047401fc23e79c000003, _id: 4fe3047401fc23e79c000003 }] Great but how do I get the values of book like the title etc?? ### mongoose.connection.db.dropDatabase -> mongoose.connection.close() ```