标题可能会引起误解(也许),但我的Rest API中存在以下情况
Employees = new Schema({
name: String,
meetings: [{ type: Schema.Types.ObjectId, ref: 'meetings'}],
// [...]
});
Meetings = new Schema({
date: Date,
employees: [{ type: Schema.Types.ObjectId, ref: 'employees'}],
// [...]
});
我有两种模式,一种用于员工,一种用于会议。
我使用express
定义了一条吸引所有人的路线。我可以使用他们引用的Meeting对象中的数据填充会议数组,作为奖励,我想用参加会议的员工填充此会议数组中的employee数组(我希望这是有道理的)>
这很容易:
// some express code
// [...]
//
router.get('/employees', (req, res) => {
Employees.find()
.populate({
path: 'meetings',
select: ['_id', 'date', 'employees'], // i exclude any other data I don't need
populate: {
path: 'employees',
select: ['_id', 'name'],
},
})
.then(result => res.json(result))
.catch(e => res.status(500).json({ error: e.message || e }));
});
这按预期工作。我唯一的不满是在employees
内的meetings
数组中,我也得到了当前员工,例如
[
{
_id: 'employeeId1',
name: 'John',
meetings: [
{
_id: 'meetingId1',
date: '2018-09-05',
employees: [
{
_id: 'employeeId1',
name: 'John',
},
{
_id: 'employeeId2',
name: 'Sarah',
},
]
}
]
}
]
我想告诉猫鼬不考虑现任员工,这可以通过findOne
router.get('/employees/:id', (req, res) => {
Employees.findOne({ _id: req.params.id })
.populate({
path: 'meetings',
select: ['_id', 'date', 'employees'],
populate: {
path: 'employees',
select: ['_id', 'name'],
match: {
_id: { $ne: req.params.id }
}
},
})
.then(result => res.json(result))
.catch(e => res.status(500).json({ error: e.message || e }));
});
正确地给了我
[
{
_id: 'personId1',
name: 'John',
meetings: [
{
_id: 'meetingId1',
date: '2018-09-05',
employees: [
{
_id: 'personId2',
name: 'Sarah',
},
]
}
]
}
]
但是在find(...).populate(...)
时,我对当前对象没有任何引用... 我吗?
我知道以后我可以在客户端实现我所需要的,但是我只是想知道是否有另一种我认为不会直接在猫鼬内实现此结果的方法