猫鼬-找到后,使用当前对象填充嵌套引用

时间:2018-09-05 08:17:39

标签: mongoose mongoose-populate

标题可能会引起误解(也许),但我的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(...)时,我对当前对象没有任何引用... 我吗?

我知道以后我可以在客户端实现我所需要的,但是我只是想知道是否有另一种我认为不会直接在猫鼬内实现此结果的方法

0 个答案:

没有答案