Заполните одну и ту же коллекцию на разных уровнях - PullRequest
0 голосов
/ 11 марта 2020

Отказ от ответственности: теперь я понимаю, что мне следовало бы использовать реляционную базу данных. Либо так, либо просто вложенные элементы в одну коллекцию, а не много разных коллекций, которые имеют вложенные отношения. Сейчас я довольно глубоко погружен в проект и не уверен, хватит ли у меня времени на перепроектирование архитектуры. Я надеюсь найти решение или хотя бы объяснение того, почему это не работает. Все в целом работает отлично, но я уже видел другие довольно яркие fl aws с моим подходом.

Все эти коллекции имеют больше свойств, но ради пространства я включил только свойства ссылок. Вот мои коллекции:

// Patients
const patientSchema = new Schema({
    files: [{ type: Schema.Types.ObjectId, ref: 'File' }],

});

const Patient = mongoose.model('Patient', patientSchema);


// Files
const fileSchema = new Schema({
    authorizations: [{ type: Schema.Types.ObjectId, ref: 'Authorization' }],
    claims: [{ type: Schema.Types.ObjectId, ref: 'Claim' }],
});

const File = mongoose.model('File', fileSchema);


// Authorizations
const authorizationSchema = new Schema({
    // No references
});
const Authorization = mongoose.model('Authorization', authorizationSchema);


// Claims
const claimSchema = new Schema({
    authorization: { type: Schema.Types.ObjectId, ref: 'Authorization' },
});

const Claim = mongoose.model('Claim', claimSchema);

Претензии принадлежат авторизации, но не всегда авторизация для претензий. Я не чувствовал, что наличие массива претензий в коллекции авторизаций является правильным применением, потому что у меня не было бы места, где можно разместить претензии, если бы для них не требовалось авторизация.

При этом я мы полагались на метод populate (), чтобы свести все эти элементы в один объект. Вот глубоко вложенный алгоритм заполнения:

const patients = await Patient.find({})
                        .populate([{
                            path: 'files',
                            populate: [{ 
                                    path: 'authorizations' 
                                }, { 
                                    path: 'claims',
                                    populate: {
                                        path: 'authorizations',
                                        model: 'Authorization'
                                    }, 
                                    options: { 
                                        sort: { 
                                            startDate: 1 
                                        } 
                                    }
                                }
                            ]
                        }, {
                            path: 'policies',
                            model: 'Policy',
                            populate: {
                                path: 'vobs',
                                populate: [{
                                        path: 'benefits'
                                    }, {
                                        path: 'eligibility', 
                                        model: 'Eligibility'
                                    }
                                ]
                            }
                        }
                    ]);

Я включил весь алгоритм, хотя вторая его половина, часть, содержащая политики, голоса, преимущества и возможности, не имеет отношения (по крайней мере, Я так не думаю).

Все работает и заполняется так, как я ожидаю. Моя неудача связана с претензиями. Код компилируется нормально, но авторизация не заполняется на уровне заявки. Я все еще остался только с ObjectId. Я просмотрел всю документацию, которую мог заполнить, и мой синтаксис наиболее точно правильный.

Я предполагаю, что это некое «правило» или «концепция», которую я просто не понимаю. Возможно ли, что, поскольку я уже заполнил полномочия один раз, я не могу заполнить их снова?

Я включил отдельный алгоритм, чтобы просматривать коллекции утверждений и полномочий отдельно и вводить только данные Мне нужно для авторизации. Этот алгоритм также работает не совсем так, как ожидалось, но это приличный кусок кода, которым я бы не стал загрязнять это пространство.

Я также рассмотрел использование собственного метода $ MongoDB lookup, а не Mon goose заселить. Если кто-то прочтет это и решит, что $ lookup здесь лучше подойдет, пожалуйста, дайте мне знать.

Еще один вопрос, который у меня возникает: могу ли я, вместо того чтобы ссылаться на всю коллекцию, ссылаться только на свойство другая коллекция? Что-то, что сделано по-другому? Или, может быть, ссылка на виртуальную коллекцию? Я довольно новичок в программировании и серверной разработке, поэтому я уверен, что есть много вариантов, о которых я не знаю. Любая помощь очень ценится!


РЕДАКТИРОВАТЬ: Я нашел решение, которое работает, но только частично. Хотя я рад видеть, что что-то вроде работает , теперь это в конечном итоге добавляет мне еще больше путаницы. После того, как я полностью завершил sh запрос, я использовал этот код:

patients.forEach(async (patient) => {
        patient.files.forEach(async (file) => {
            file.claims.forEach(async (claim) => {
                await claim.populate('authorization', (err) => {
                    if (err) {
                        console.log(err);
                    } else {
                        console.log(claim.authorization);
                    }
                });
            });
        });
    });

И это фактически заполняет полномочия! Хорошие новости. Я использую Express и Handlebars вместе с MongoDB / Mon goose. Как я уже сказал, все отлично работает. Внутри этой функции, когда я вижу console.log, я вижу авторизацию. Я передаю, что пациенты возражают как мой объект через express к моему шаблону руля. Вот где все становится странным, и я не могу понять, почему это произойдет.

Полномочия заполняются только для определенного количества пациентов. Каждый раз одни и те же пациенты . Для остальных пациентов я получаю только ObjectId. Как это могло быть возможно? Как это может работать только частично ? Из того, что я вижу, нет абсолютно ничего, что отличает этих первых четырех пациентов. Между ними даже есть пациент, у которого нет никаких разрешений, но это ничего не выбрасывает. Технически, он успешно проходит через пять пациентов, прежде чем перестает работать. Но все полномочия заполняются в бэк-энде . Как они могли там заселяться, частично проходить, а затем депопулировать (?) Себя?

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