2017-10-20 51 views
1

在我的应用我需要找到分类的话,我想这个分类图书猫鼬发现所有然后找到所有其他模式每个

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

请有人知道如果有更好的解决方案,这个查询? 谢谢大家!

+3

您可以用'populate'的方式。 http://mongoosejs.com/docs/populate.html – yBrodsky

+0

再次我没有在你的例子中得到所有类别和他们的书籍,我只有他们的书籍只有1个类别 – Alin

+1

[如何深入猫鼬](https ://sackoverflow.com/questions/41255313/how-to-deep-populate-on-mongoose) – iagowp

回答

0

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

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

再次我没有得到你的例子中的所有类别和他们的书籍,我只有他们的书籍只有1类别 – Alin

+0

你应该扭转顺序,说: Category.find()... –

+0

类别。 find({category:category._id})。 填充('书籍')。 exec(function(err,story){if(err)return handleError(err); //做其他事情 }); ,它不会工作,因为类别模式没有书籍的参考 – Alin

2

这个怎么样?

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

这可能是更漂亮,但它只会让一个请求到你的数据库,并应工作你想

+0

它很好的答案,我想知道是否猫鼬暴露这种情况下的API,如'填充'。 – Alin

+0

暴露api意味着什么? – iagowp

+0

我的意思是有官方的解决方案,填充的例子可以使用承诺和for循环,并获得相同的结果,但猫鼬使用这种情况下填充方法,所以我问他们是否有我的方案的官方方法 – Alin