2017-04-09 24 views
0

我试图填充猫鼬模型,我只希望返回的项目是与ID匹配的项目。猫鼬,填充ID是特定于项目参考

编辑更新:在下面的User模型中,我需要先通过id找到正确的用户,然后对于task属性,我需要填充它,其中projectID匹配req.params.ID。我怎样才能填充projectID匹配req.params.ID的任务。我已经包括了我的全部用户模型以及任务模式

//用户模式

var UserSchema = new Schema({ 
    name: { 
    type: String, 
    trim: true, 
    required: "First Name is Required" 
    }, 
    username: { 
    type: String, 
    trim: true, 
    required: "Username is Required" 
    }, 
    skills: { 
    type: String, 
    trim : true 
    }, 
    avatar: { 
    type: String 
    }, 
    SQLid: { 
    type: Number 
    }, 
    userCreated: { 
    type: Date, 
    default: Date.now 
    }, 
    lastUpdated: { 
    type: Date 
    }, 
    adminTeams: [{ 
    type: Schema.Types.ObjectId, 
    ref: "Team" 
    }], 
    team: [{ 
    type: Schema.Types.ObjectId, 
    ref: "Team" 
    }], 
    task: [{ 
    projectID: { 
     type: String 
    }, 
    theTask: { 
     type: Schema.Types.ObjectId, 
     ref: "Task" 
    } 
    }] 
}); 

//任务模式

var TodoSchema = new Schema({ 
    task: { 
    type: String 
    } 
}); 

如何我只得到填充task在专案编号等于一个特定的ID。我试过

User.findById({ "_id": req.params.id }).populate({ path: 'task', match: {projectID: req.params.pID}, select: 'theTask' }) 
    .exec(function(err, docs){ 
    console.log("POPULATE TASKS DOCS", docs) 

但是这表明文档是空的。

回答

0

您可以使用$elemMatch,它会为您提供所有与您的projectId匹配并填充您的任务文档的文档。 因此,查询将是 -

var query={ 
      task:{ 
        $elemMatch:{ 
          projectId: req.params.id 
           } 
        } 
      } 

User.find(query) 
.populate('theTask') 
.select('theTask') // use for getting selective data from document 
.exec(function(){}) //your callback fuction 

希望我回答你的问题。

谢谢。

+0

我想这一点,但它返回任务和项目的_id,而不是实际的任务。我已经包含了我的完整用户模型和任务模型 – henhen

0

在您的任务schma中,您已将任务类型的类型保留为string,并且在您的用户架构中,任务包含任务和任务的参考,其Self仅为string。这就是为什么没有被填充了..

因此更改任务架构(保持简单) -

var Task= new Schema({ 
    name :string 
    }); 

填充需要refrence Id以获取整个文档