我从医疗保健项目中遵循了Mongo Schema(被截断以隐藏项目敏感信息)。
let PatientSchema = mongoose.Schema({_id:String})
let PrescriptionSchema = mongoose.Schema({_id:String, patient: { type: Number, ref: 'Patient', createdAt:Date }})
let ReportSchema = mongoose.Schema({_id:String, patient: { type: Number, ref: 'Patient', createdAt:Date }})
let EventsSchema = mongoose.Schema({_id:String, patient: { type: Number, ref: 'Patient', createdAt:Date }})
移动和网络应用程序中有一个ui屏幕,称为“健康历史记录”,在这里我需要对根据createAt排序的处方,报告和事件中的条目进行分页。因此,我正在构建一个REST端点来获取这种异构数据。我该如何实现。是否可以从多个架构模型创建“视图”,以便我不会加载所有3个架构的内容来获取一页条目。我的“视图”的架构应如下所示,以便我可以对其进行其他查询(例如,查找上一个报告)
{recordType:String,/* prescription/report/event */, createdDate:Date, data:Object/* content from any of the 3 tables*/}
答案 0 :(得分:0)
我可以想到三种方法来做到这一点。
实现这一目标的最简单方法是使用以下聚合:
db.Patients.aggregate([
{$match : {_id: <somePatientId>},
{
$lookup:
{
from: Prescription, // replicate this for Report and Event,
localField: _id,
foreignField: patient,
as: prescriptions // or reports or events,
}
},
{ $unwind: prescriptions }, // or reports or events
{ $sort:{ $createDate : -1}},
{ $skip: <positive integer> },
{ $limit: <positive integer> },
])
您将不得不对其进行进一步调整,以获取正确的createdDate。为此,您可能需要查看$ replaceRoot运算符。
第二个选项是创建一个新的“元”集合,该集合可保存您的实际事件列表,但仅使用refPath处理这三个事件,同时保留对患者以及实际事件的引用不同的事件类型。这个解决方案是最优雅的,因为它使查询数据的方式更加容易,并且性能也可能更高。尽管如此,它仍然需要您创建和处理另一个集合,这就是为什么我不建议将此作为主要解决方案的原因,因为我不知道您是否可以创建新集合。
作为最后一个选择,您可以在Patient中创建virtual populate fields,该功能会自动提取所有处方,报告和事件。这样做的缺点是您无法真正正确地排序和分页...