2014-01-12 3 views
43

В Mongoose я могу использовать запрос для заполнения дополнительных полей после запроса. Я могу также заполнить несколько путей, такие какMongoose: множественный запрос заполняется одним вызовом

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

Однако, это будет генерировать поиск по книге сбора поля для заголовка, страниц и режиссера - а также поиск на фильме сбора поля для заголовка, страниц и режиссера также. Я хочу получить титул и страницы только из книг, а режиссер из фильма. Я мог бы сделать что-то вроде этого:

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

, который дает мне ожидаемый результат и запросы.

Но есть ли способ иметь поведение второго фрагмента, используя аналогичный синтаксис «одной строки», такой как первый фрагмент? Причина этого заключается в том, что я хочу программно определить аргументы для функции заполнения и передать ее. Я не могу сделать это для нескольких вызовов заполнения.

ответ

104

После просмотра в исходный код из мангуста, я решил это с:

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

Person.find({}) 
.populate(populateQuery) 
.execPopulate() 
+0

Имеет ли такое использование влияние производительности на объединение нескольких населенных пунктов? – scaryguy

+21

Вы должны принять свой собственный ответ. – royhowie

+1

С простым exec он не будет работать? –

1

вы также можете сделать что-то, как показано ниже:

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

Это, как это делается на основе документации Mongoose JS http://mongoosejs.com/docs/populate.html

Предположим, у вас есть схема BookCollection, которая содержит пользователей и книги Чтобы выполнить запросите и получите все BookCollections со связанными с ним пользователями и книгами, которые вы сделали бы это.

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); 
    } 
Смежные вопросы