Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Querying nested embedded documents with Mongoose

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()
like image 305
JMWhittaker Avatar asked Dec 21 '22 20:12

JMWhittaker


2 Answers

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);
}
like image 162
ruffrey Avatar answered Dec 24 '22 00:12

ruffrey


right now nested sub document population is not supported. i added a link to this post to the open github issue for future tracking.

https://github.com/LearnBoost/mongoose/issues/601

like image 34
aaronheckmann Avatar answered Dec 24 '22 00:12

aaronheckmann