用Mongoose查询嵌套嵌入式文档

问题描述:

我想在嵌套嵌入式文档内查询。我试图“填充”结果,但是失败了。用Mongoose查询嵌套嵌入式文档

如何找回查找呼叫中的所有书籍详情?我想要一个用户书架上的所有书籍对象,我可以从中获取数据?

### 

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() 
+0

这将是很好的接受支票移动到“深人口”的答案,现在解决了这个问题。 – JohnnyHK

深人口在猫鼬3.6加入。 https://github.com/LearnBoost/mongoose/issues/1377#issuecomment-15911192

对于你的榜样,它会是这样的:

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

非常好的soluation !!!!! – Steven

+0

这似乎已在v3.6和v4.0.8之间发生变化。填充返回一个承诺,你可以传递一个函数:http://mongoosejs.com/docs/api.html#model_Model.populate –

现在不支持嵌套的子文档群体。我添加了这个帖子的链接到未来的跟踪开放github问题。

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

+0

非常感谢亚伦。 – JMWhittaker