3 votes

Créer une vue à partir de plusieurs collections MongoDB

J'ai les schémas Mongo suivants (tronqués pour cacher les informations sensibles du projet) d'un projet de santé.

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 }})

Il y a un écran d'interface utilisateur de l'application mobile et web appelé Historique de santé, où je dois paginer les entrées de la prescription, des rapports et des événements triés en fonction de createAt. Je suis donc en train de construire un point de terminaison REST pour obtenir ces données hétérogènes. Comment puis-je y parvenir ? Est-il possible de créer une "Vue" à partir de plusieurs modèles de schémas de sorte que je ne charge pas le contenu des 3 schémas pour récupérer une page d'entrées. Le schéma de ma "Vue" devrait ressembler à ce qui suit afin que je puisse exécuter des requêtes supplémentaires (par exemple, trouver le dernier rapport).

{recordType:String,/* prescription/report/event */, createdDate:Date, data:Object/* content from any of the 3 tables*/}

1voto

BenSower Points 548

Je vois trois façons de procéder.

Je pense que la manière la plus simple d'y parvenir est d'utiliser une agrégation comme celle-ci :

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> },
])

Vous devrez l'adapter davantage pour obtenir également la date de création correcte. Pour cela, vous pouvez utiliser l'opérateur $replaceRoot.

La deuxième option consiste à créer une nouvelle collection "méta", qui contient votre liste d'événements, mais seulement une référence à votre patient ainsi qu'à l'événement réel à l'aide de l'élément refPath pour gérer les trois différents types d'événements. Cette solution est la plus élégante, car elle facilite l'interrogation des données et est probablement plus performante. Cependant, elle nécessite la création et la gestion d'une autre collection, c'est pourquoi je n'ai pas voulu la recommander comme solution principale, car je ne sais pas si vous pouvez créer une nouvelle collection.

En dernier recours, vous pouvez créer remplir virtuellement les champs dans Patient, qui récupèrent automatiquement toutes les prescriptions, tous les rapports et tous les événements. L'inconvénient est qu'il n'est pas possible de trier et de paginer correctement...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X