web-dev-qa-db-fra.com

Mangouste: plusieurs requêtes remplies en un seul appel

Dans Mongoose, je peux utiliser un remplissage de requête pour remplir des champs supplémentaires après une requête. Je peux également remplir plusieurs chemins, tels que

Person.find({})
 .populate('books movie', 'title pages director')
 .exec()

Cependant, cela générerait une recherche sur le livre regroupant les champs pour le titre, les pages et le réalisateur - et également une recherche sur le film rassemblant les champs pour le titre, les pages et le réalisateur également. Ce que je veux, c'est obtenir le titre et les pages des livres uniquement, et le réalisateur du film. Je pourrais faire quelque chose comme ça:

Person.find({})
 .populate('books', 'title pages')
 .populate('movie', 'director')
 .exec()

ce qui me donne le résultat attendu et les requêtes.

Mais existe-t-il un moyen d'avoir le comportement du deuxième extrait de code en utilisant une syntaxe de "ligne unique" similaire au premier extrait de code? La raison en est que je veux déterminer par programme les arguments de la fonction de remplissage et l'introduire. Je ne peux pas le faire pour plusieurs appels de remplissage.

59
Se7enDays

Après avoir regardé le code source de mangouste, je résous ce problème avec:

var populateQuery = [{path:'books', select:'title pages'}, {path:'movie', select:'director'}];

Person.find({})
 .populate(populateQuery)
 .execPopulate()
125
Se7enDays

vous pouvez également faire quelque chose comme ci-dessous:

{path:'user',select:['key1','key2']}
5
Kartik Garasia

Voici comment cela se fait sur la base de la documentation Mongoose JS http://mongoosejs.com/docs/populate.html

Disons que vous avez un schéma BookCollection qui contient des utilisateurs et des livres Pour effectuer une requête et obtenir tous les BookCollections avec ses utilisateurs et livres associés, vous devez le faire

models.BookCollection
    .find({})
    .populate('user')
    .populate('books')
    .lean()
    .exec(function (err, bookcollection) {
    if (err) return console.error(err);
    try {
        mongoose.connection.close();
        res.render('viewbookcollection', { content: bookcollection});

    } catch (e) {
        console.log("errror getting bookcollection"+e);
    }
2
Lawrence Edmondson