Mongoose Find All,然后为每个查找其他模式

在我的应用程序中,我需要find类别,然后我想要这个类别的书籍

const CategorySchema = mongoose.Schema({ displayname: String, category: String }); module.exports = mongoose.model('Category', CategorySchema); } const BookSchema = mongoose.Schema({ name: String, img: String, category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category' } }); module.exports = mongoose.model('Books', BookSchema); 

我需要这样的回应

 categories = [ { category: 'News', books: [{name:'',id''},{}..] }, { category: 'Sports', books: [{name:'',id''},{}..] } ]; 

所以我的代码看起来像这样

 Router.get('/categories/', (req, res) => { Category.find({}, (err, categories) => { Promise.all(categories.map(category => { return Book.find({category: category._id}).then( books => { return { category: category, books: books }; }) })).then( categories => { res.json(categories); }) }) }); 

请有人知道如果有更好的解决scheme,这个查询? 感谢所有!

这个怎么样?

 Router.get('/categories/', (req, res) => { Book.find().populate('category').then( books => { var categories = {} for(var i = 0; i < books.length; i++){ categories[books[i].category.displayname] = { category: books[i].category.displayname books: categories[books[i].category.displayname].books ? categories[books[i].category.displayname].books.push(books[i]) : [books[i]] }; } var result = []; for(var key in categories){ result.push(categories[key]) } return result; }); }); 

它可能更漂亮,但它只能向你的数据库发出一个请求,应该按你想要的方式工作

http://mongoosejs.com/docs/populate.html

 Book. find({}). populate('category'). exec(function (err, story) { if (err) return handleError(err); // Do other things });