2016-06-08 7 views
2

가의 아래와 같이 수정하여 scaryguy에서 우수한 example을 빌려 아이 스키마에 정의 된 기준에 따라 부모 개체를 채우는 인구, 즉 '반전' 스키마 :몽구스

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

사용자 스키마 :

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

그럼 난 인구 다음을 수행 할 수 참조 필드 ID를 객체되지 않습니다

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는 String 유형의 ProjectGroup의 고유 식별자입니다. –

+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, 해결책은 훌륭합니다. projectGroupId 이외의 ProjectGroup 필드는 결과에서 사용할 수 없습니다. 기본적으로 나는 아직 이용 가능하지 않은 '반전 된'인구를 찾고 있습니다. –