Mangusto: várias consultas são preenchidas em uma única chamada

No Mongoose, posso usar uma consulta para preencher campos adicionais após uma consulta. Eu também posso preencher vários caminhos, como

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

No entanto, isso geraria uma pesquisa no livro reunindo os campos para título, páginas e diretor – e também uma pesquisa sobre o filme reunindo os campos para título, páginas e diretor também. O que eu quero é obter título e páginas apenas de livros e diretor do filme. Eu poderia fazer algo assim:

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

que me dá o resultado esperado e consultas.

Mas existe alguma maneira de ter o comportamento do segundo snippet usando uma syntax similar de “linha única” como o primeiro snippet? A razão para isso, é que eu quero determinar programaticamente os argumentos para a function de preenchimento e alimentá-lo. Eu não posso fazer isso para várias chamadas de preenchimento.

Depois de olhar para o código fonte do mangusto, eu resolvi isso com:

 var populateQuery = [{path:'books', select:'title pages'}, {path:'movie', select:'director'}]; Person.find({}) .populate(populateQuery) .execPopulate() 

Você também pode fazer algo como abaixo:

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

É assim que é feito com base na documentação do Mongoose JS http://mongoosejs.com/docs/populate.html

Digamos que você tenha um esquema BookCollection que contenha usuários e livros. Para realizar uma consulta e obter todos os BookCollections com seus usuários e livros relacionados, você faria isso

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