首页 > 解决方案 > 在猫鼬中实现递归子文档数组的好方法是什么?

问题描述

目的是从这里开始:

    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 的请求中创建团队)

标签: javascriptnode.jsmongodbmongoose

解决方案


推荐阅读