Каков хороший способ реализации массива рекурсивных вложенных документов в mongoose? - PullRequest
0 голосов
/ 11 сентября 2018

Цель состоит в том, чтобы перейти от этого:

    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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...