2016-06-08 5 views
2

Давайте брать отличную example от scaryguy с модификацией, как показано ниже:Мангуст «обратный» население, то есть заселение родительского объекта на основании справки, определенной в детской схеме

группа проекта схемы:

var ProjectGroupSchema = new Schema({ 
    projectGroupId : String, 
    title    : String 
}); 

проекта Схема:

var ProjectSchema = new Schema({ 
    title   : {type : String, default : '', required : true}, 
    group   : {type: String, ref: 'ProjectGroup' }, 
    subscribers : [{type: String, ref: 'User' }] 
}); 

Schema Пользователь:

var UserSchema = new Schema({ 
    userId  : {type: String, require: true}, 
    firstName : {type: String, required: true}, 
    lastName  : {type: String, required: true}, 
}); 

Тогда я могу сделать следующие популяции:

project.findById(req.projectId}) 
.populate('subscribers') 
.populate('group') 
.exec(function(err, project){ 
     console.log(project); 
}); 

Обратите внимание, что ссылки на поля не идентификаторы объектов.

В этом примере схема проекта имеет ссылочные поля как для группы проектов, так и для абонентов, что делает возможным такое население.

Что делать, если я хочу получить объект ProjectGroup, который содержит все проекты под этой группой, и каждый проект содержит своих подписчиков?

Я бы сказал, что я ищу «обратную» популяцию, то есть заполнение родительского объекта на основе ссылки, определенной в дочерней схеме. В настоящий момент я использую async для запроса ProjectGroup сначала, а затем запрашиваю проекты на основе projectGroupId.

Спасибо!

+0

Что такое 'projectGroupId'? Идентификатор объекта 'ProjectSchema'? – Chinni

+0

projectGroupId - уникальный идентификатор ProjectGroup в String. –

+0

Может быть, я опаздываю, но вы можете взглянуть на виртуальное население –

ответ

2

Вы можете добиться этого, используя функцию агрегата. Первые группы проектов «projectGroup», а затем заполняют результат.

project.aggregate([ 
    {$group: {_id: "$group", projects: {$push: "$$ROOT"}}} 
], 
    function(err,results) { 
    user.populate(results, { "path": "projects.subscribers" }, function(err,results) { 
     if (err) 
     console.log(err); 
     res.send(results); 
    }); 

}); 
+1

Спасибо vartika, это хорошо, только поля ProjectGroup, отличные от projectGroupId, недоступны в результате. В основном я ищу «перевернутое» население, которое, по-видимому, пока недоступно. –