caso de uso: Análisis impulsados por aplicaciones, interoperabilidad, modernización
Industrias: Atención sanitaria, servicios de salud del gobierno, ciencias de la vida
Productos: MongoDB Atlas, MongoDB Atlas Search
emparejar: openEHR
Descripción general de la solución
openEHR es una forma de estructurar registros clínicos de modo que su significado médico siga siendo coherente, por más que las aplicaciones y las bases de datos evolucionen. Separa la estructura técnica estable del registro de las definiciones clínicas utilizadas para modelar conceptos del mundo real, como las observaciones, los medicamentos o los diagnósticos.
Técnicamente, openEHR es una arquitectura de EHR basada en modelos. Su modelo de referencia define la estructura estable de los registros clínicos, mientras que los arquetipos y las plantillas agregan el significado clínico y las restricciones de implementación. Su unidad de registro primaria es el COMPOSITION, un documento clínico jerárquico cuyo contenido se consulta por AQL. El AQL es independiente del modelo de almacenamiento. Combina cláusulas similares a SQL con rutas jerárquicas y predicados CONTAINS en estructuras clínicas anidadas. Escalar estos queries de forma eficiente puede ser un desafío.
En la práctica, un repositorio openEHR a menudo necesita dar soporte a las siguientes familias de queries. La primera corresponde a la recuperación de un solo paciente; por ejemplo, abrir la gráfica de un paciente conocido o recuperar un documento clínico específico dentro de un EHR. La segunda implica la recuperación operativa entre pacientes; por ejemplo, crear una cohorte, encontrar pacientes que cumplan una regla de seguridad, generar listas de trabajo o identificar casos similares durante la atención. Estas consultas operativas deben ejecutarse cerca del flujo de trabajo de la aplicación, con una latencia baja y predecible.
Muchas implementaciones tienen dificultades para soportar ambos patrones de query de manera eficiente. Los enfoques relacionales pueden funcionar bien para la recuperación en función del paciente, pero las queries cruzadas a gran escala suelen generar presión en las uniones, la pérdida de esquemas y la variación de plantillas. Delegar esas cargas de trabajo a una plataforma analítica separada puede ayudar con el análisis retrospectivo, pero crea duplicación, suma latencia, fragmenta la gobernanza y los registros de auditoría, y debilita el objetivo de una interfaz de query de AQL unificada. También puede eliminar el contexto clínico relevante cuando los documentos se aplanan de forma demasiado agresiva.
Reconciliar familias de queries clínicos
Esta solución aborda ese problema con un modelo de persistencia semiaplanado y enfocado en los documentos en MongoDB: semiaplanado porque aplanamos cada elemento como un nodo de un arreglo, pero cada uno conserva la carga útil JSON completa en la estructura original; y enfocado en los documentos porque cada composición openEHR se conserva como un solo documento MongoDB, en lugar de descomponerse en una tabla por arquetipo o una fila por ruta. Al mismo tiempo, la composición se materializa como un arreglo de nodos reconstruible, lo que permite un query eficiente basada en rutas sin abandonar la composición como unidad operativa.
Cada nodo almacenado conserva los siguientes elementos clave:
Subárbol clínico local, para que el significado y el contexto originales permanezcan disponibles.
Metadatos posicionales, para reconstruir la estructura y el orden.
Ruta AQL invertida, que permite la coincidencia eficiente de restricciones de ruta de profundidad variable.
La ruta invertida es una clave de query general que se utiliza para evaluar predicados estructurales de manera eficiente en las rutas de ejecución por paciente y entre pacientes. Admite la coincidencia con restricciones de ruta en diferentes estrategias de ejecución, incluida la coincidencia basada en regex y la resolución de rutas con comodín en los índices de búsqueda. Se pueden aplicar los mismos patrones de query cuando los predicados usan otros componentes de ruta textual o condiciones textuales.
Con este modelo, las cláusulas de AQL se pueden compilar de manera determinista en las etapas de query de MongoDB. Las restricciones FROM, CONTAINS y WHERE se convierten en predicados objetivo sobre rutas y valores de nodos. Este enfoque mantiene la composición intacta como contenedor clínico primario a la vez que hace que la recuperación operativa sea práctica a gran escala.
Figura 1. Representación de composiciones semiaplanadas donde cada nodo lleva su propio contexto y valores, más la ruta de AQL invertida
Nota
Para acceder a un extracto publicado sobre la arquitectura y la evaluación, consulta el resumen de la conferencia revisado por pares. Para conocer el diseño completo, que incluye el modelo de persistencia semiaplanado, la compilación determinista de AQL a MQL y los detalles de las pruebas de referencia, consulta el documento técnico completo.
Enrutamiento por carga de trabajo
Para muchos repositorios, una sola colección semi-aplanada y los índices de comodines son suficientes. Para implementaciones más grandes, el modelo puede usar una proyección de búsqueda estrecha que contiene solo los datos necesarios para un filtrado amplio entre pacientes. Luego, la ejecución del query se enruta por alcance. Una proyección de búsqueda estrecha es una colección derivada más pequeña que almacena solo los campos de nodo necesarios para un filtrado amplio entre pacientes. No sustituye al documento de composición principal. Reduce la amplitud del índice y el costo de búsqueda para queries operativas amplias.
Por lo tanto, ofrece las siguientes modalidades:
Las queries por paciente se ejecutan en la colección de la composición principal, utilizando índices dirigidos como un índice compuesto en campos como
ehr_idyreversed_path.Las query entre pacientes se ejecutan sobre la proyección más estrecha, compilando las restricciones de ruta en comodines o coincidencias en la ruta invertida, y los predicados de valor en operadores de igualdad, rango o búsqueda.
Este modelo de ejecución proporciona una única interfaz de query, lo que permite diferentes rutas de acceso físico según el tamaño y la selectividad de la carga de trabajo.
Por qué es importante brindar soporte a las queries de cohorte de operaciones
Las aplicaciones clínicas modernas requieren cada vez más ambas familias de queries en la misma plataforma. Es posible que un médico necesite abrir el registro de un paciente inmediatamente y hacer preguntas como las siguientes:
¿Qué pacientes recibieron un determinado medicamento en una ventana de tiempo determinada?
¿Qué pacientes cumplen con un protocolo o una norma de seguridad?
¿Qué casos anteriores son clínicamente similares a este?
Estas preguntas operativas requieren respuestas sin procesar los datos a través de ciclos ETL repetidos en sistemas separados.
Un modelo semiaplanado centrado en documentos conserva las fortalezas de openEHR y hace que esas cargas de trabajo sean prácticas. Mantiene la composición como la unidad operativa principal, preserva la fidelidad clínica mediante una estructura reconstruible y evita que los equipos de aplicación tengan que elegir entre un almacén centrado en el paciente y una plataforma separada para múltiples pacientes. Los repositorios más pequeños pueden seguir siendo simples, con una colección semiaplanada. Los repositorios más grandes pueden agregar una proyección más pequeña para reducir el costo del filtrado operativo amplio.
En nuestra evaluación, este enfoque mantuvo una latencia de extremo a extremo baja en ambos tipos de carga de trabajo, con tiempos de respuesta bajos para las queries por paciente y entre pacientes, incluso a gran escala. Esta eficiencia lo valida como una base práctica para repositorios openEHR que debe admitir la recuperación operativa, el procesamiento atento a la procedencia, el enriquecimiento semántico y los flujos de trabajo impulsados por IA desde una sola plataforma.
Nota
Punto de prueba de producción: esta arquitectura se valida en producción en un repositorio con más de 1.2 mil millones de documentos persistentes.
Explora este patrón con kehrnel, un entorno de ejecución de referencia experimental y conjunto de herramientas para estrategias de datos clínicos centradas en los documentos.
Al seguir este enfoque obtienes los siguientes beneficios prácticos:
Un modelo semiaplanado que se puede reconstruir y conserva la fidelidad de la composición.
Realización de queries por paciente eficientes sin forzar un fragmento relacional del documento clínico.
Compatibilidad con la recuperación operativa entre pacientes sin recurrir por defecto a una arquitectura centrada en el almacén de datos.
Una superficie de query operativo para los equipos de aplicación, en lugar de almacenes duplicados y lógica fragmentada.
Una ruta para reducir los gastos en general de ETL, la desviación de la gobernanza y el costo total de propiedad.
¿Qué es Kehrnel y por qué usarlo?
Kehrnel es un entorno de ejecución de estrategias que transforma los modelos de datos sanitarios en capacidades operativas. Existe porque definir un modelo de datos sanitarios no es suficiente. Los equipos también necesitan una forma repetible de validar datos, transformarlos en una representación operativa, ingerirlos, consultarlos, mantenerlos y mejorarlos a medida que cambian los requisitos. Sin esa capa de ejecución, los modelos a menudo se quedan en documentación, esquemas de almacenamiento o especificaciones aisladas.
El objetivo es más amplio que construir un motor openEHR. El entorno de ejecución Kehrnel proporciona un enfoque repetible centrado en los documentos para hacer que los modelos de datos sanitarios se puedan ejecutar, inspeccionar y reutilizar en las API, herramientas y flujos de trabajo de IA. Con el tiempo, el mismo patrón de entorno de ejecución puede admitir otras familias de modelos y estrategias operativas, incluidos FHIR, flujos de trabajo de datos sintéticos, catálogos semánticos, recuperación del lenguaje natural y otras herramientas específicas de dominio.
El Kehrnel está diseñado en torno a flujos de trabajo expuestos que se pueden personalizar según las necesidades de cada estrategia de persistencia. Cada estrategia puede definir sus propias operaciones de activación, validación, ingestión, transformación, consulta, datos sintéticos y mantenimiento, sin dejar de utilizar un modelo de entorno de ejecución coherente.
El kehrnel empieza con openEHR porque openEHR es un modelo exigente y con una gran riqueza semántica. Incluye arquetipos, plantillas, rutas, terminología y un comportamiento de query complejo. Esto lo convierte en una base sólida para demostrar un enfoque de entorno de ejecución impulsado en modelos.
Para esta solución, el Kehrnel sirve como entorno de ejecución de referencia y paquete de herramientas para el patrón de persistencia centrado en los documentos.
Figura 2. Captura de pantalla de la CLI de Kehrnel
Arquitecturas de Referencia
La figura 3 muestra el flujo de extremo a extremo de esta estrategia en el kehrnel, desde la entrada canónica de openEHR hasta la ejecución del query enrutado.
Figura 3. Compilador AQL y entorno de ejecución (kehrnel) de enrutamiento
Capa 1: las fuentes de datos comienzan con las composiciones de openEHR canónicas, el catálogo de modelos de plantillas operativas y los datos sintéticos opcionales utilizados para pruebas a gran escala. El OPT es el artefacto del entorno de ejecución compilado derivado de arquetipos y plantillas. Los sistemas operacionales utilizan el OPT para la validación y el procesamiento que reconoce rutas.
Capa 2: la pipeline de transformación convierte cada composición entrante en la representación persistente utilizada por esta estrategia. El paso de semiaplanado escanea la jerarquía de composición, aplica la codificación de rutas y códigos, y utiliza reglas de asignación para materializar nodos que se pueden consultar. El resultado produce un documento de MongoDB semiaplanado por composición, con nodos almacenados que mantienen un subárbol clínico local, metadatos posicionales y una clave de ruta invertida.
Capa 3: los diccionarios y las asignaciones almacenan los artefactos asistentes requeridos para esta estrategia. _codes y _shortcuts admiten la resolución y codificación de rutas compactas. Las asignaciones almacenan las reglas específicas de la estrategia que impulsan la transformación y la compilación de queries.
Capa 4: las colecciones de MongoDB muestran las opciones de persistencia. La colección principal de composiciones almacena los documentos de composición semiaplanados y sirve para la ejecución por paciente a través de un índice compuesto en ehr_id y cn.p. Para repositorios grandes, la colección de búsqueda opcional almacena una proyección estrecha de los puntos de datos de los nodos necesarios para el filtrado entre pacientes. Esta colección está indexada con MongoDB Atlas Search. El patrón de doble colección mantiene las asignaciones de búsqueda más acotadas y el costo de búsqueda más bajo.
Capa 5: el motor de query es donde el kehrnel analiza y enruta el AQL. El entorno de ejecución acepta una instrucción AQL, valida el AST, resuelve los alias y las proyecciones seguras, detecta si el query es sobre por paciente o entre pacientes y emite la ruta MQL adecuada. Cuando el query incluye ehr_id, el entorno de ejecución emite una pipeline de agregación por paciente en la colección de composiciones, que normalmente utiliza etapas como $match, $project, $sort y $limit. Cuando el query es entre pacientes, el entorno de ejecución emite una pipeline que prioriza la búsqueda sobre la proyección estrecha, utilizando operadores como embeddedDocument, wildcard, range y equals dentro de un filtro compuesto. Aunque puede mantener algunas queries entre pacientes en la colección base cuando los predicados de template/time/order son compatibles.
Capa 6: interfaces del entorno de ejecución que exponen esta estrategia tanto a través de la CLI del kehrnel como de la API HTTP. La CLI admite flujos de trabajo de operador, como la configuración del entorno, la activación de estrategias, la compilación y la ejecución de queries. La API expone las mismas capacidades de ejecución para la integración, automatización y documentación interactiva.
Este diseño en capas proporciona a los equipos de aplicación una superficie de query operativo lógico y permite diferentes rutas de acceso basadas en el tamaño del repositorio, el alcance del query y la selectividad de la carga de trabajo.
Enfoque de modelo de datos
Almacena cada composición como un documento de MongoDB persistencia con forma semiaplanada. Cada nodo almacenado contiene:
Subárbol clínico local
Clave de ruta invertida
Metadatos posicionales para la reconstrucción
Esta estructura hace que el modelo dé prioridad al documento y se pueda consultar a escala. Evita crear un diseño de tabla por arquetipo y obligar a cada query a usar solo la forma JSON anidada original.
En este modelo, las rutas de openEHR siguen siendo de primera clase. El documento persistente mantiene la composición como unidad operativa y el arreglo de nodos proporciona al compilador una estructura determinista para query.
El siguiente documento simplificado muestra un ejemplo de composición persistente legible. Tiene un formato explicativo, por lo que los nombres de los campos y los valores de las rutas son más fáciles de seguir que en una codificación de producción compacta.
{ "_id": "...", "ehr_id": "patient-001", "composition_id": "c-001", "template_id": "openEHR-EHR-COMPOSITION.vaccination_list.v0", "version": 1, "cn": [ { "p": "ACTION.medication.v1.SECTION.immunisation_list.v0.COMPOSITION.vaccination_list.v0", "kp": "content[0]/items[0]", "pi": [0,0], "bk": "b1", "data": { "time": { "value": "2026-01-15T10:30:00Z" }, "other_participations": { "performer": { "identifiers": { "id": "038321545" } } }, "code": { "value": "J07BX03" } } } ] }
Cómo leer este documento
Un documento de MongoDB representa una composición de openEHR. El arreglo cn almacena los nodos consultables extraídos de esa composición. Cada nodo mantiene un subárbol clínico local en data, una clave de ruta invertida en p y metadatos posicionales como kp, pi y bk para que se pueda reconstruir la estructura original.
El ejemplo público muestra la clave de ruta de forma legible para que la traducción sea más fácil de seguir. En producción, puedes almacenar la misma ruta como tokens compactos codificados en un diccionario para reducir el tamaño de la ruta y la huella del índice.
Codificación de ruta invertida
El campo de ruta almacenado representa la optimización clave. Los atributos del modelo de referencia y los identificadores del nodo del arquetipo compilan las rutas de openEHR. Esta solución utiliza una ruta almacenada invertida, lo que permite que las restricciones de contención se evalúen mediante coincidencias que admitan prefijos en lugar del escaneo de comodines iniciales. Esta configuración funciona con las coincidencias estándar basadas en expresiones regulares en la ruta por paciente y con las coincidencias del tipo comodín en la ruta de búsqueda.
Traducción determinista de AQL a MQL
AQL es independiente del modelo de almacenamiento, lo que hace efectiva la compilación determinista. Las cláusulas SQL se traducen a MQL de la siguiente manera:
FROMyCONTAINSse transforman en predicados de ruta estructural.WHEREse convierte en predicados de valor en las cargas útiles de los nodos coincidentes.SELECTse convierte en proyección.ORDER BYse convierte en orden.
El siguiente ejemplo ilustra un query AQL.
SELECT e/ehr_id/value AS ehrId, c/uid/value AS compositionId, med_ac/description[at0017]/items[at0140]/items[at0141]/value/defining_code/code_string AS locationCode FROM EHR e CONTAINS COMPOSITION c[openEHR-EHR-COMPOSITION.vaccination_list.v0] CONTAINS ( CLUSTER adminInfo[openEHR-EHR-CLUSTER.admin_salut.v0] AND SECTION[openEHR-EHR-SECTION.immunisation_list.v0] AND ACTION med_ac[openEHR-EHR-ACTION.medication.v1] ) WHERE med_ac/time/value >= '2000-04-13T07:54:16.345Z' AND med_ac/time/value <= '2026-02-13T07:54:16.345Z' AND adminInfo/items[at0007]/items[at0014]/value/defining_code/code_string = 'E08019820' AND med_ac/other_participations/performer/identifiers/id = '038321545' ORDER BY med_ac/time/value DESC
Qué solicita este AQL
Este query combina restricciones estructurales y basadas en valores. La cláusula CONTAINS define las estructuras openEHR necesarias, en este caso una composición de vacunación que contiene un clúster administrativo y una acción de medicación. A continuación, la cláusula WHERE agrega predicados en la hora de la acción, el identificador del actor y un código administrativo.
Este tipo de query se beneficia de la compilación determinista. Expresa condiciones sobre estructuras clínicas jerárquicas y valores locales de nodo.
Cómo el compilador asigna AQL a MQL
El MQL compilado sigue la misma lógica que el AQL:
El filtro
ehr_idde nivel superior hace que el query sea por paciente.La cláusula
$allrequiere que todas las bifurcaciones estructurales descritas por el AQL estén presentes en la misma composición.Cada
$elemMatchenlaza un predicado de ruta y su valor es predica del mismo nodo almacenado.El predicado en
pes la forma compilada de la lógicaCONTAINSestructural.Los predicados contenidos en los datos son la forma compilada de las condiciones
WHERE.En una pipeline completa, el compilador agrega las etapas de proyección y clasificación que corresponden a
SELECTyORDER BY.
El siguiente ejemplo muestra un patrón de MQL simplificado por paciente, generado a partir del query de AQL anterior. Ilustra la lógica del compilador, no una carga de ejecución byte a byte.
// Simplified compiler output for a single-EHR query. // Projection and sorting stages are omitted here for clarity. db.compositions.aggregate([ { "$match": { "ehr_id": "b416bc97-de39-43f5-9d47-712af6688947~r1", "cn": { "$all": [ { "$elemMatch": { "p": { "$regex": /^ACTION\.medication\.v1(?:\.[^.]+)*\.SECTION\.immunisation_list\.v0(?:\.[^.]+)*\.COMPOSITION\.vaccination_list\.v0$/ }, "data.time.value": { "$gte": ISODate("2000-04-13T07:54:16.345Z"), "$lte": ISODate("2026-02-13T07:54:16.345Z") }, "data.other_participations.performer.identifiers.id": "038321545" } }, { "$elemMatch": { "p": { "$regex": /^at0014\.at0007\.CLUSTER\.admin_salut\.v0(?:\.[^.]+)*\.COMPOSITION\.vaccination_list\.v0$/ }, "data.value.defining_code.code_string": "E08019820" } } ] } } } ]);
Cómo se traslada la misma lógica a la ruta de búsqueda
La traducción lógica se mantiene igual en la ruta entre pacientes. La diferencia radica en la ejecución física. En lugar de buscar la coincidencia en la colección principal de composiciones, el compilador se centra en la proyección de búsqueda estrecha. Las restricciones estructurales en la ruta inversa se convierten en filtros de comodines, y los predicados de valor se convierten en filtros de rango e igualdad.
El siguiente ejemplo muestra un patrón MQL generado a partir de un AQL no vinculado a un paciente. Como antes, ilustra la lógica del compilador, no una carga de ejecución byte a byte.
{ "$search": { "index": "search_nodes_index", "compound": { "filter": [ { "embeddedDocument": { "path": "sn", "operator": { "compound": { "filter": [ { "wildcard": { "path": "sn.p", "query": "ACTION.medication.v1*SECTION.immunisation_list.v0*COMPOSITION.vaccination_list.v0" } }, { "range": { "path": "sn.data.time.value", "gte": ISODate("2000-04-13T07:54:16.345Z"), "lte": ISODate("2025-04-13T07:54:16.345Z") } }, { "equals": { "path": "sn.data.other_participations.performer.identifiers.id", "value": "038321545" } } ] } } } } ] } } }
Estructuras repetidas y hermanos con la misma ruta
Algunas estructuras de openEHR pueden contener nodos hermanos repetidos con la misma ruta efectiva; por ejemplo, EVENTs repetidos. Estos casos requieren que el compilador eleven los predicados a niveles más profundos para que el mismo elemento repetido cumpla las condiciones. En la agregación estándar, eso indica $elemMatch anidadas a mayor profundidad. En la ruta de búsqueda, el equivalente es embeddedDocument, que vincula varias condiciones al mismo elemento de un arreglo incrustado.
Compilar la solución
Utiliza el kehrnel, disponible en este repositorio, como entorno de ejecución de referencia y conjunto de herramientas para este patrón. El kehrnel proporciona el ciclo de vida de la estrategia, el flujo de validación, la pipeline de semiaplanamiento y la ruta de compilación AQL utilizada para ingerir composiciones de openEHR canónicas y enrutar queries operativas por la ruta de ejecución correcta.
En el momento de la activación, el kehrnel expone la estrategia a través de manifest.json, utiliza defaults.json como base de activación, valida las sobrescrituras con schema.json y aplica el plan de almacenamiento e índice que la implementación de la estrategia y spec.json describen. La ruta recomendada es dejar que el kehrnel cree colecciones e índices B-tree a partir de la configuración activa en lugar de crearlos manualmente primero en MongoDB.
El repositorio posiciona al kehrnel como un entorno de ejecución experimental para demostración, enseñanza, creación rápida de prototipos y prueba de conceptos. Para reproducir esta solución en tu propio entorno, sigue estos pasos:
Configura MongoDB en Atlas
Crea un clúster de Atlas y decide qué base de datos contendrá los datos de la estrategia.
En esta fase, sólo necesitas el nombre de la base de datos de destino y la cadena de conexión.
Para MacOS y Linux:
export MONGODB_URI="<your-atlas-connection-string>" export MONGODB_DB="openEHR_demo"
Para Windows Powershell:
set MONGODB_URI=<your-atlas-connection-string> set MONGODB_DB="openEHR_demo" exit
Clonar el repositorio de GitHub e iniciar el kehrnel
Clona el repositorio e inicia el entorno de ejecución con ./startKehrnel. Este punto de entrada prepara el entorno local automáticamente y mantiene la primera ejecución simple.
git clone https://github.com/mongodb-industry-solutions/kehrnel cd kehrnel ./startKehrnel export RUNTIME_URL="${RUNTIME_URL:-http://localhost:8080}" Alternative direct API entrypoint: uvicorn kehrnel.api.app:app --reload --port 8080
Después del inicio, confirma que se puede acceder al entorno de ejecución y usa el kehrnel como plano de control para el resto del flujo de trabajo.
Una vez iniciado, el kehrnel expone un sitio de Docusaurus en la ruta http://localhost:8080/guide. La figura 4 muestra el sitio.
Figura 4. Documentación de Kehrnel
Configurar el contexto de la CLI y crear un entorno
Apunta la CLI al entorno de ejecución en funcionamiento, crea el entorno destino e inspecciónalo. El entorno es la unidad de activación en kehrnel. Aísla la configuración de la estrategia, los enlaces, los artefactos generados y el estado operativo sin forzar cambios en el código de la estrategia.
Point the CLI at the running kehrnel runtime kehrnel context set --runtime-url "$RUNTIME_URL" kehrnel core health kehrnel core env create --env dev --name "Development" kehrnel core env list kehrnel core env show --env dev
Descubre y activa la estrategia
Kehrnel admite varios entornos, dominios y estrategias. En esta guía, selecciona explícitamente el dominio openehr y la estrategia openehr.rps_dual .
Utiliza src/kehrnel/engine/strategies/openehr/rps_dual/defaults.json como configuración de base, y agrega un pequeño archivo de sobrescritura sólo cuando quieras cambiar los nombres de las colecciones, las etiquetas de los campos, la habilitación de las búsquedas, los diccionarios, los separadores, las políticas de codificación o las asignaciones.
La activación es el paso donde el kehrnel materializa las colecciones configuradas y los índices B-tree de la configuración de estrategia activa. Para el ejemplo de referencia empaquetado, el archivo de sobrescritura de activación apunta el strategy a las asignaciones de proyección empaquetadas. El bootstrap del diccionario se aplica entonces según las configuraciones de activación de la estrategia.
Nota
Para comprender la superficie de configuración de openehr.rps_dual completa y los cambios que se pueden aplicar, consulta la guía de configuración de estrategias. Esta guía explica qué controla cada configuración en la base de la estrategia, incluidos los nombres de colección, las etiquetas de campo, la habilitación del lado de la búsqueda, las semillas de diccionario, el separador de rutas y las políticas de codificación
mkdir -p .kehrnel Local plaintext MongoDB bindings for the walkthrough cat > .kehrnel/bindings.mongo.yaml <<EOF db: provider: mongodb uri: ${MONGODB_URI} database: ${MONGODB_DB} EOF Packaged activation override for the reference dual-collection example kehrnel core env activate \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --config src/kehrnel/engine/strategies/openehr/rps_dual/samples/reference/activation.config.json \ --allow-plaintext-bindings \ --bindings .kehrnel/bindings.mongo.yaml \ --force Ensure bundled dictionaries are present kehrnel run ensure_dictionaries --env dev --domain openehr Generate the Atlas Search definition derived from the active mappings kehrnel strategy build-search-index \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --out .kehrnel/search-index.json
Prepara plantillas, mapeos y composiciones canónicas
Trabaja con los activos de muestra propios de la estrategia de src/kehrnel/engine/strategies/openehr/rps_dual/samples o con tus propias entradas de openEHR canónicas.
Utilice plantillas OPT para validar o generar composiciones.
Utiliza las asignaciones de proyección empaquetadas cuando quieras que la colección del lado de la búsqueda se construya a partir de la misma configuración que impulsa la ingesta y la generación de índices de búsqueda.
SAMPLES_ROOT="src/kehrnel/engine/strategies/openehr/rps_dual/samples/reference" Inspect the packaged reference assets ls "$SAMPLES_ROOT/templates" ls "$SAMPLES_ROOT/queries" ls "$SAMPLES_ROOT/envelopes" ls "$SAMPLES_ROOT/projection_mappings.json" \ "$SAMPLES_ROOT/search_index.definition.json" \ "$SAMPLES_ROOT/manifest.json" Optional: generate and validate a sample composition from a packaged OPT kehrnel common generate -- \ -t "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ -o .kehrnel/composition.json \ --random kehrnel common validate -- \ -c .kehrnel/composition.json \ -t "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ --stats Optional: generate a starter source-to-canonical mapping skeleton kehrnel common map-skeleton -- \ "$SAMPLES_ROOT/templates/sample_laboratory_v0_4.opt" \ -o .kehrnel/mapping.skeleton.yaml \ --macros
Ingesta de composiciones
Ingerir composiciones a través de la estrategia. Los sobres NDJSON empaquetados son contenedores de composición openEHR canónicos que incluyen la composición enmascarada más metadatos como ehr_id, template_id, composition_version y time_committed.
Aquí se utiliza la ingestión ejecutada por kehrnel, mientras que esta guía parte de sobres de openEHR canónicos y necesita la estrategia para producir el documento base semiaplanado y, si existen asignaciones para la plantilla, el documento de proyección opcional del lado de la búsqueda.
Las siguientes banderas de archivos locales son solo una medida de seguridad que permite que el entorno de ejecución lea el NDJSON de muestra empaquetado de su árbol de trabajo.
Cuando existen asignaciones para una plantilla, el kehrnel también crea el documento opcional del lado de la búsqueda en compositions_search. Si no existen asignaciones para una plantilla, omite ese sidecar en lugar de emitir arreglos vacíos.
The CLI expands the local NDJSON into documents before sending the request. kehrnel run ingest \ --env dev \ --domain openehr \ --strategy openehr.rps_dual \ --set file_path="$SAMPLES_ROOT/envelopes/all.ndjson"
Compila e inspecciona el AQL
Compila AQL representativo antes de ejecutarlo.
Confirma el ámbito resuelto, el MQL emitido y la ruta de ejecución seleccionada.
Este paso de compilación es el contrato operativo clave del patrón. Las aplicaciones permanecen en AQL, mientras que el kehrnel gestiona la traducción determinista y la planificación de ejecución contra el modelo de almacenamiento.
Compile only: inspect the execution plan without running the query kehrnel core env compile-query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/patient_laboratory_by_ehr.aql" kehrnel core env compile-query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/cross_patient_laboratory_by_performing_centre.aql"
Ejecutar consultas operativas
Ejecuta tanto un query por paciente como un query entre pacientes en el mismo entorno. Esta ejecución demuestra el valor principal del patrón: una superficie de query operativo, en la que el entorno de ejecución elige la ruta de ejecución física correcta para la carga de trabajo.
Para las queries por paciente, el entorno de ejecución puede apuntar a la colección principal semiaplanada con las etapas indexadas $match, $project, $sort y $limit. Para una recuperación operativa más amplia, el entorno de ejecución puede enrutarse por la ruta orientada a la búsqueda cuando la forma del query se beneficia de ella.
Execute both representative queries kehrnel core env query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/patient_laboratory_by_ehr.aql" kehrnel core env query \ --env dev \ --domain openehr \ --aql "$SAMPLES_ROOT/queries/cross_patient_laboratory_by_performing_centre.aql"
Explorar los artefactos generados
Inspecciona los documentos de MongoDB generados, la proyección opcional del lado de la búsqueda y la definición del índice de búsqueda de Atlas para comprobar el diseño centrado en documentos.
Observa cómo las composiciones canónicas siguen siendo la entrada de origen, cómo la forma semiaplanada admite consultas deterministas y cómo las asignaciones impulsan la proyección del lado de la búsqueda en lugar de duplicar todo el documento a ciegas.
Inspect the generated base and search-side documents mongosh "$MONGODB_URI/$MONGODB_DB" <<'MONGOSH' db.compositions_rps.findOne({}, { ehr_id: 1, tid: 1, time_c: 1, cn: { $slice: 3 } }) db.compositions_search.findOne({}, { ehr_id: 1, comp_id: 1, tid: 1, sort_time: 1, sn: 1 }) MONGOSH Inspect the generated Atlas Search definition cat .kehrnel/search-index.json
Extender el patrón a toda la CLI
Una vez que el flujo base funcione, continúa con la CLI en lugar de pasar directamente a la conexión de API personalizada. La CLI ya expone los principales componentes operativos:
Ciclo de vida del entorno
Activación de la estrategia
Configuración del diccionario
Generación de índice de búsqueda
Compilación de queries
Ejecución de queries
Este conjunto de herramientas convierte al kehrnel en el plano de control natural para el trabajo estratégico. Una aplicación o interfaz de usuario independiente puede situarse sobre él, pero la estrategia en sí sigue pudiéndose trasladar, inspeccionar y operar directamente a través del entorno de ejecución y la CLI.
Continue through the CLI for strategy operations and discovery kehrnel op capabilities --env dev kehrnel op schema synthetic_generate_batch --strategy openehr.rps_dual kehrnel run rebuild_codes --env dev --domain openehr kehrnel run rebuild_shortcuts --env dev --domain openehr kehrnel run build_search_index_definition \ --env dev \ --domain openehr \ --strategy openehr.rps_dual
Nota
¿Te gustaría experimentar con este patrón en un entorno de pruebas guiado? El Laboratorio de datos sanitarios se basa en el entorno kehrnel para ayudar a los equipos a modelar, consultar y probar estrategias de datos sanitarios centradas en documentos, incluido este enfoque de persistencia de openEHR. Actualmente, está disponible en vista previa privada. Comunícate con tu representante de cuenta de MongoDB para solicitar acceso.
Lecciones clave
Composiciones persistentes como documentos semiaplanados: mantén un documento de MongoDB por composición, pero almacénalo como una forma semiaplanada que se puede reconstruir en lugar de como una carga útil anidada sin procesar.
Codificar y revertir rutas para una coincidencia eficiente: convierte las rutas estructurales de AQL en tokens compactos invertidos para que
CONTAINSpueda asignarlos a predicados que admitan prefijos.Enrutar el AQL por alcance: usa
ehr_idpara mantener los queries por paciente a nivel local y enviar queries entre pacientes a Atlas Search cuando corresponda.Elegir una colección o dos según la escala: una única colección semiaplanada puede funcionar bien, pero los repositorios muy grandes se benefician de una proyección de búsqueda estrecha.
Mantener una superficie de query operativa: permite que los equipos de aplicación permanezcan en AQL mientras el entorno de ejecución se encarga de la compilación determinista y la planificación de la ejecución.
Autores
Francesc Mateu Amengual, MongoDB
Giovanni Rodriguez, MongoDB
Greg Cox, MongoDB
Juan Crossley, MongoDB
Obtén más información
Consulta los estándares de openEHR
Consulta las especificaciones de AQL de openEHR