在猫鼬中实现递归子文档数组的好方法是什么?

时间:2018-09-11 07:25:30

标签: javascript node.js mongodb mongoose

目的是从此出发:

    const team1 = {
        members: [
            {
                role: 'Employee',
                name: 'A',
            },
            {
                role: 'Leader',
                name: 'B',
                subs: [
                    {
                        role: 'Employee',
                        name: 'C'
                    },
                    {
                        role: 'Leader',
                        name: 'D',
                        subs: [
                            {
                                role: 'Employee',
                                name: 'E'
                            }
                        ]
                    }
                ]
            }
        ]
    };

对此:

{"_id":"5b9692afdbc5ae16048dc5ec","members":[{"_id":"5b9692afdbc5ae16048dc5f1","role":"Employee","name":"A"},{"_id":"5b9692afdbc5ae16048dc5ed","role":"Leader","name":"B","subs":[{"_id":"5b9692afdbc5ae16048dc5f0","role":"Employee","name":"C"},{"_id":"5b9692afdbc5ae16048dc5ee","role":"Leader","name":"D","subs":[{"_id":"5b9692afdbc5ae16048dc5ef","role":"Employee","name":"E"}]}]}],"__v":0}

一行:

const data = new Team(team1);
data.save();

我是通过以下配置实现的:

    const HumanSchema = new Schema({
        name: String,
    }, { discriminatorKey: 'role'});
    const EmployeeSchema = new Schema({}, { discriminatorKey: 'role'});
    const LeaderSchema = new Schema({subs: [HumanSchema]}, { discriminatorKey: 'role'});
    const TeamSchema = new Schema({
        members: [HumanSchema]
    }, {discriminatorKey: 'role'});
    TeamSchema.path('members').discriminator('Employee', EmployeeSchema);
    TeamSchema.path('members').discriminator('Leader', LeaderSchema);
    LeaderSchema.path('subs').discriminator('Employee', EmployeeSchema);
    LeaderSchema.path('subs').discriminator('Leader', LeaderSchema);

那么,首先,这是最好的方法吗?还是有其他简单的方法来获得相同的结果?

其次,假设我们要从第一个团队的一部分建立另一个团队 喜欢:

const data = new Team(team1);
const res = data.save();
const team2 = res.members[1].subs; 
/* which is     [{"_id":"5b9692afdbc5ae16048dc5f0","role":"Employee","name":"C"},{"_id":"5b9692afdbc5ae16048dc5ee","role":"Leader","name":"D","subs":[{"_id":"5b9692afdbc5ae16048dc5ef","role":"Employee","name":"E"}]}] */
const data2 = new Team(team2);

然后一名员工想要更改他/她的名字, 如何在一个请求中在两个团队中对其进行更新?

如果我不能猜测必须更改架构配置,那是最好的选择? (请记住,我需要在一个json请求中创建团队)

0 个答案:

没有答案