Отказ от ответственности: теперь я понимаю, что мне следовало бы использовать реляционную базу данных. Либо так, либо просто вложенные элементы в одну коллекцию, а не много разных коллекций, которые имеют вложенные отношения. Сейчас я довольно глубоко погружен в проект и не уверен, хватит ли у меня времени на перепроектирование архитектуры. Я надеюсь найти решение или хотя бы объяснение того, почему это не работает. Все в целом работает отлично, но я уже видел другие довольно яркие 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. Как это могло быть возможно? Как это может работать только частично ? Из того, что я вижу, нет абсолютно ничего, что отличает этих первых четырех пациентов. Между ними даже есть пациент, у которого нет никаких разрешений, но это ничего не выбрасывает. Технически, он успешно проходит через пять пациентов, прежде чем перестает работать. Но все полномочия заполняются в бэк-энде . Как они могли там заселяться, частично проходить, а затем депопулировать (?) Себя?