2017-10-20 50 views
1

dans ma demande que je dois trouver des catégories, alors je veux Livres pour cette CatégoriesMongoose Trouver tous puis trouver tous dans d'autres schémas pour chaque

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

i ont besoin d'une réponse comme celui-ci

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

donc mon code ressemble à ceci

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

veuillez s'il vous plaît savoir si vous avez une meilleure solution pour cette requête? merci à tous!

+3

vous pouvez utiliser 'populate'. http://mongoosejs.com/docs/populate.html – yBrodsky

+0

encore je n'obtiens pas toutes les catégories et leurs livres dans votre exemple, je reçois seulement 1 catégorie avec leurs livres – Alin

+1

Copie possible de [Comment peupler profond sur mongoose] (https : //stackoverflow.com/questions/41255313/how-to-deep-populate-on-mongoose) – iagowp

Répondre

0

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

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

encore une fois je ne reçois pas toutes les catégories et leurs livres dans votre exemple, je reçois seulement 1 catégorie avec leurs livres – Alin

+0

Vous devez inverser l'ordre, dites: Category.find() ... –

+0

Catégorie. find ({category: category._id}). peupler ('livres'). exec (fonction (err, histoire) { si (err) renvoie handleError (err); // Fait d'autres choses }); , ça ne marchera pas parce que sur le schéma de catégorie ne pas avoir de refernce pour les livres – Alin

2

Comment cela?

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

Il pourrait être plus joli, mais il ne fait qu'une seule demande à votre db et devrait fonctionner de la façon dont vous voulez

+0

c'est une bonne réponse, je veux savoir si mongoose expose api pour ce scénario, comme "peupler". – Alin

+0

Qu'entendez-vous par exposer api? – iagowp

+0

je veux dire que vous avez une solution officielle, un exemple pour peupler vous pouvez utiliser des promesses et pour les boucles et obtenir les mêmes résultats mais utilisez mongoose méthode populate pour ce scénario, donc je demande s'ils ont la méthode officielle pour mon scénario – Alin