caso de uso: Análisis impulsado por aplicaciones, interoperabilidad, modernización
Industrias: Atención sanitaria, servicios de salud gubernamentales,ciencias de la vida
Productos: MongoDB Atlas, Búsqueda enMongoDB Atlas
Socios: openEHR
Descripción general de la solución
openEHR es una forma de estructurar los registros clínicos para que su significado médico se mantenga coherente, incluso cuando las aplicaciones y las bases de datos evolucionan. Separa la estructura técnica estable del registro de las definiciones clínicas utilizadas para modelar conceptos del mundo real, como observaciones, medicamentos o diagnósticos.
Técnicamente, openEHR es un sistema basado en modelos. Arquitectura de la HCE. Su modelo de referencia define la estructura estable de los registros clínicos, mientras que los arquetipos y las plantillas añaden el significado clínico y las restricciones de implementación. Su unidad de registro principal es el
COMPOSITION, un documento clínico jerárquico cuyo contenido se consulta mediante AQL. AQL es independiente del modelo de almacenamiento. Combina cláusulas similares a SQL con rutas jerárquicas y CONTAINS predicados sobre estructuras clínicas anidadas. Escalar estas consultas de manera eficiente puede ser un desafío.
En la práctica, un repositorio openEHR suele necesitar admitir las siguientes familias de consultas. La primera corresponde a la recuperación de información de un solo paciente, por ejemplo, abrir la historia clínica de un paciente conocido o recuperar un documento clínico específico dentro de un EHR. La segunda implica la recuperación operativa de información de varios pacientes, por ejemplo, crear una cohorte, encontrar pacientes que cumplan una regla de seguridad, generar listas de trabajo o identificar casos similares durante la prestación de atención médica. 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 admitir ambos patrones de consulta de manera eficiente. Los enfoques relacionales pueden funcionar bien para la recuperación de información a nivel de paciente, pero las consultas a gran escala entre pacientes suelen generar problemas debido a las uniones, los cambios de esquema y la variación de plantillas. Descargar estas cargas de trabajo a una plataforma analítica independiente puede facilitar el análisis retrospectivo, pero crea duplicación, aumenta la latencia, fragmenta la gobernanza y los registros de auditoría, y debilita el objetivo de una interfaz de consulta AQL unificada. Además, puede eliminar el contexto clínico relevante cuando los documentos se simplifican de forma demasiado agresiva.
Reconciliar familias de consultas clínicas
Esta solución aborda el problema mediante un modelo de persistencia semi-aplanado basado en documentos en MongoDB. Semi-aplanado significa que cada elemento se presenta como un nodo en un array, pero conserva la carga útil JSON completa en su estructura original. El enfoque basado en documentos implica que cada composición de openEHR se conserva como un único documento de 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 array de nodos reconstruible, lo que permite realizar consultas eficientes basadas en rutas sin abandonar la composición como unidad operativa.
Cada nodo almacenado conserva los siguientes elementos clave:
Subárbol clínico local, de modo que el significado y el contexto originales permanezcan disponibles.
Metadatos posicionales, para que se pueda reconstruir la estructura y el orden.
Ruta AQL invertida, que permite una coincidencia eficiente de restricciones de ruta de profundidad variable.
La ruta invertida es una clave de consulta general que se utiliza para evaluar predicados estructurales de manera eficiente tanto en rutas de ejecución específicas para cada paciente como entre diferentes pacientes. Admite la coincidencia con restricciones de ruta en distintas estrategias de ejecución, incluyendo la coincidencia basada en expresiones regulares y la resolución de rutas con comodines en los índices de búsqueda. Los mismos patrones de consulta se pueden aplicar cuando los predicados utilizan otros componentes de ruta textual o condiciones textuales.
Con este modelo, las cláusulas AQL se pueden compilar de forma determinista en las etapas de consulta de MongoDB. Las restricciones FROM, CONTAINS y WHERE se convierten en predicados específicos sobre las rutas y los valores de los nodos. Este enfoque mantiene la composición intacta como contenedor clínico principal, al tiempo que facilita la recuperación operativa a gran escala.
Figura 1. Representación de composiciones semiaplanadas donde cada nodo lleva su propio contexto y valores más la ruta AQL invertida.
Nota
Para obtener un resumen conciso y publicado de la arquitectura y la evaluación, consulte el resumen de la conferencia revisado por pares. Para conocer el diseño completo, incluido el modelo de persistencia semiplanado, la compilación determinista de AQL a MQL y los detalles de las pruebas de rendimiento, consulte el artículo técnico completo.
Enrutamiento por carga de trabajo
Para muchos repositorios, una única colección semiplana e índices comodín son suficientes. Para implementaciones más grandes, el modelo puede usar una proyección de búsqueda reducida que contenga solo los datos necesarios para un filtrado amplio entre pacientes. La ejecución de la consulta se enruta según el alcance. Una proyección de búsqueda reducida es una colección derivada más pequeña que almacena solo los campos de nodo necesarios para un filtrado amplio entre pacientes. No reemplaza el documento de composición principal. Reduce la amplitud del índice y el costo de búsqueda para consultas operativas amplias.
Por lo tanto, ofrece las siguientes modalidades:
Las consultas con ámbito de paciente se ejecutan en la colección de composición principal, utilizando índices específicos como un índice compuesto en campos como
ehr_idyreversed_path.Las consultas entre pacientes se ejecutan sobre la proyección más reducida, compilando las restricciones de ruta en comodines o coincidencias en la ruta inversa, y los predicados de valor en operadores de igualdad, rango o búsqueda.
Este modelo de ejecución proporciona una única interfaz de consulta, lo que permite diferentes rutas de acceso físico en función del tamaño y la selectividad de la carga de trabajo.
Por qué es importante brindar soporte a las consultas de la Operación Cohorte
Las aplicaciones clínicas modernas requieren cada vez más ambas familias de consultas en la misma plataforma. Un médico podría necesitar abrir el historial de un paciente de inmediato y hacer preguntas como:
¿Qué pacientes recibieron un determinado medicamento en un período de tiempo específico?
¿Qué pacientes cumplen con un protocolo o una norma de seguridad?
¿Qué casos anteriores son clínicamente similares a este?
Estas cuestiones operativas requieren respuestas sin tener que transferir datos a través de ciclos ETL repetidos a sistemas separados.
Un modelo semiplanificado que prioriza los documentos conserva las ventajas de openEHR y hace que esas cargas de trabajo sean prácticas. Mantiene la composición como la unidad operativa autorizada, preserva la fidelidad clínica mediante una estructura reconstruible y evita que los equipos de desarrollo de aplicaciones tengan que elegir entre un repositorio centrado en el paciente y una plataforma separada para todos los pacientes. Los repositorios más pequeños pueden seguir siendo sencillos, con una colección semiplanificada. Los repositorios más grandes pueden añadir una proyección menor para reducir el coste del filtrado operativo general.
En nuestra evaluación, este enfoque mantuvo una baja latencia de extremo a extremo en ambos tipos de carga de trabajo, con tiempos de respuesta reducidos para consultas específicas de pacientes y consultas entre pacientes, incluso a gran escala. Esta eficiencia lo valida como una base práctica para los repositorios de historias clínicas electrónicas abiertas que deben admitir la recuperación operativa, el procesamiento con conocimiento de la procedencia, el enriquecimiento semántico y los flujos de trabajo basados en IA desde una única plataforma.
Nota
Prueba de producción: Esta arquitectura se valida en producción en un repositorio con más de 1.2 7600 mil millones de documentos almacenados.
Puedes explorar este patrón con kehrnel, un entorno de ejecución de referencia experimental y un conjunto de herramientas para estrategias de datos clínicos basadas en documentos.
Seguir este enfoque le brinda los siguientes beneficios prácticos:
Un modelo semiplano reconstruible que conserva la fidelidad de la composición.
Consultas eficientes centradas en el paciente sin necesidad de fragmentar la información clínica.
Compatibilidad con la recuperación operativa entre pacientes sin recurrir por defecto a una arquitectura que priorice el almacenamiento de datos.
Una única interfaz de consulta operativa para los equipos de aplicaciones, en lugar de almacenes duplicados y lógica fragmentada.
Un camino hacia una menor sobrecarga de ETL, una menor desviación de la gobernanza y un menor coste total de propiedad.
¿Qué es Kehrnel y por qué usarlo?
Kehrnel es una plataforma estratégica que transforma los modelos de datos sanitarios en capacidades operativas. Kehrnel existe porque definir un modelo de datos sanitarios no es suficiente. Los equipos también necesitan una forma estandarizada de validar los datos, transformarlos en una representación operativa, ingerirlos, consultarlos, mantenerlos y adaptarlos a medida que cambian los requisitos. Sin esta capa de ejecución, los modelos suelen quedarse en documentación, esquemas de almacenamiento o especificaciones aisladas.
El objetivo va más allá de crear un motor de historias clínicas electrónicas abiertas. Kehrnel ofrece un enfoque repetible, centrado en el documento, para que los modelos de datos sanitarios sean ejecutables, inspeccionables y reutilizables en diversas API, herramientas y flujos de trabajo de IA. Con el tiempo, este mismo patrón de ejecución podrá admitir otras familias de modelos y estrategias operativas, como FHIR, flujos de trabajo de datos sintéticos, catálogos semánticos, recuperación de lenguaje natural y otras herramientas específicas del sector.
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, ingesta, transformación, consulta, datos sintéticos y mantenimiento, manteniendo un modelo de ejecución coherente.
Kehrnel parte de openEHR porque es un modelo exigente y semánticamente rico. Incluye arquetipos, plantillas, rutas, terminología y un comportamiento de consulta complejo. Esto lo convierte en una base sólida para demostrar un enfoque de ejecución basado en modelos.
Para esta solución, Kehrnel sirve como entorno de ejecución y conjunto de herramientas de referencia para el patrón de persistencia basado en el documento.
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 kehrnel, desde la entrada canónica de openEHR hasta la ejecución de la consulta enrutada.
Figura 3. Compilador AQL y entorno de ejecución de enrutamiento (kehrnel)
1Capa: Las fuentes de datos comienzan con composiciones canónicas de openEHR, el catálogo de modelos de plantillas operativas y datos sintéticos opcionales utilizados para pruebas a gran escala. La OPT es el artefacto de tiempo de ejecución compilado derivado de arquetipos y plantillas. Los sistemas operativos utilizan la OPT para la validación y el procesamiento con reconocimiento de rutas.
2Capa: La canalización de transformación convierte cada composición entrante en la representación persistente utilizada por esta estrategia. El paso de semiaplanamiento examina la jerarquía de composición, aplica codificación de ruta y código, y utiliza reglas de mapeo para materializar los nodos consultables. El resultado produce un documento MongoDB semiaplanado por composición, con nodos almacenados que conservan un subárbol clínico local, metadatos posicionales y una clave de ruta invertida.
3Capa: Los diccionarios y las asignaciones almacenan los artefactos auxiliares necesarios 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 consultas.
4Capa: Las colecciones de MongoDB muestran las opciones de persistencia. La colección principal de composiciones almacena los documentos de composición semi-aplanados y permite la ejecución con ámbito de paciente mediante un índice compuesto ehr_id en cn.p y. Para repositorios grandes, la colección de búsqueda opcional almacena una proyección reducida de los puntos de datos del nodo necesarios para el filtrado entre pacientes. Esta colección se indexa con MongoDB Atlas Search. El patrón de doble colección mantiene las asignaciones de búsqueda más específicas y reduce el coste de búsqueda.
5Capa: El motor de consultas es donde kehrnel analiza y enruta AQL. El entorno de ejecución acepta una instrucción AQL, valida el AST, resuelve alias y proyecciones seguras, detecta si la consulta es de ámbito de paciente o entre pacientes, y emite la ruta MQL apropiada. Cuando la consulta ehr_id incluye, el entorno de ejecución emite una canalización de agregación de ámbito de paciente sobre la colección de composiciones, normalmente utilizando etapas $match $projectcomo,, $sort $limity. Cuando la consulta es entre pacientes, el entorno de ejecución emite una canalización de búsqueda primero sobre la proyección slim, utilizando operadores embeddedDocument wildcardrangecomo,, y equals dentro de un filtro compuesto. Mientras que puede mantener algunas consultas entre pacientes en la colección base cuando template/time/order los predicados son compatibles con la coincidencia.
6Capa: Las interfaces de tiempo de ejecución exponen esta estrategia tanto a través de la CLI de kehrnel como de la API HTTP. La CLI admite flujos de trabajo de operador, como la configuración del entorno, la activación de la estrategia, la compilación y la ejecución de consultas. La API expone las mismas capacidades de tiempo de ejecución para la integración, la automatización y la documentación interactiva.
Este diseño por capas proporciona a los equipos de aplicación una superficie de consulta operativa lógica y permite diferentes rutas de acceso en función del tamaño del repositorio, el alcance de la consulta y la selectividad de la carga de trabajo.
Enfoque de modelo de datos
Almacena cada composición como un documento de MongoDB, persistido en un formato semiplano. 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 priorice el documento y permita realizar consultas a gran escala. Se evita crear una tabla por arquetipo y obligar a que cada consulta utilice únicamente la estructura JSON anidada original.
En este modelo, las rutas de openEHR siguen siendo de primera clase. El documento persistente conserva la composición como unidad operativa, y el array de nodos proporciona al compilador una estructura determinista para realizar consultas.
El siguiente documento simplificado muestra un ejemplo legible de composición persistente. Está formateado para facilitar la explicación, de modo que los nombres de los campos y los valores de las rutas sean 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 array cn almacena los nodos consultables extraídos de dicha composición. Cada nodo conserva 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 en un formato legible para facilitar la traducción. En producción, puede almacenar la misma ruta como tokens codificados en diccionario compacto para reducir el tamaño de la ruta y el espacio que ocupa en el índice.
Codificación de ruta inversa
El campo de ruta almacenada representa la optimización clave. Los atributos del modelo de referencia y los identificadores de nodos de arquetipo construyen las rutas de openEHR. Esta solución utiliza una ruta almacenada invertida, lo que permite evaluar las restricciones de contención con coincidencias compatibles con prefijos en lugar de escaneos con comodines iniciales. Esta configuración funciona con coincidencias estándar basadas en expresiones regulares en la ruta con ámbito de paciente y con coincidencias de estilo 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 que la compilación determinista sea efectiva. Las cláusulas SQL se traducen a MQL de la siguiente manera:
FROMyCONTAINSse convierten en predicados de ruta estructural.WHEREse convierte en predicados de valor en las cargas útiles del nodo coincidente.SELECTse convierte en proyección.ORDER BYse convierte en clasificación.
El siguiente ejemplo ilustra una consulta 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
Lo que solicita este AQL
Esta consulta combina restricciones estructurales y basadas en valores. La cláusula CONTAINS define las estructuras de openEHR requeridas, en este caso una composición de vacunación que contiene un grupo administrativo y una acción de medicación. La cláusula WHERE agrega predicados sobre el tiempo de acción, el identificador del profesional y un código administrativo.
Este tipo de consulta se beneficia de la compilación determinista. Expresa condiciones sobre estructuras clínicas jerárquicas y valores locales de los nodos.
Cómo el compilador asigna AQL a MQL
El código MQL compilado sigue la misma lógica que el código AQL:
El filtro de nivel superior
ehr_idhace que la consulta esté limitada al ámbito del paciente.La cláusula
$allrequiere que todas las ramas estructurales descritas por el AQL estén presentes en la misma composición.Cada
$elemMatchvincula un predicado de ruta y sus predicados de valor al mismo nodo almacenado.El predicado en
pes la forma compilada de la lógica estructuralCONTAINS.Los predicados bajo los datos son la forma compilada de las condiciones
WHERE.En una canalización completa, el compilador agrega las etapas de proyección y ordenación que corresponden a
SELECTyORDER BY.
El siguiente ejemplo muestra un patrón MQL simplificado, específico para cada paciente, generado a partir de la consulta AQL anterior. Ilustra la lógica del compilador, no la carga útil de tiempo 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 aplica 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 realizar la coincidencia en la colección principal de composiciones, el compilador se centra en la proyección de búsqueda reducida. Las restricciones estructurales en la ruta inversa se convierten en filtros comodín, 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 una consulta AQL no vinculada a un paciente específico. Como antes, ilustra la lógica del compilador, no la carga útil de tiempo 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 repetido. En estos casos, el compilador debe profundizar en los predicados para que las condiciones se cumplan con el mismo elemento repetido. En la agregación estándar, esto significa anidar más profundamente $elemMatch. En la ruta de búsqueda, el equivalente es embeddedDocument, que vincula múltiples condiciones al mismo elemento de matriz incrustado.
Compilar la solución
Utilice kehrnel, disponible en este repositorio, como entorno de ejecución y conjunto de herramientas de referencia para este patrón. Kehrnel proporciona el ciclo de vida de la estrategia, el flujo de validación, la canalización de aplanamiento parcial y la ruta de compilación AQL que se utilizan para ingerir composiciones canónicas de openEHR y dirigir las consultas operativas a través de la ruta de ejecución correcta.
En el momento de la activación, kehrnel expone la estrategia a través de manifest.json, utiliza defaults.json como línea base de activación, valida las anulaciones con schema.json y aplica el plan de almacenamiento e indexación descrito por la implementación de la estrategia y spec.json. La ruta recomendada es permitir que kehrnel cree las colecciones y los índices B-tree a partir de la configuración activa en lugar de crearlos manualmente en MongoDB.
El repositorio posiciona a kehrnel como un entorno de ejecución experimental para demostración, enseñanza, creación rápida de prototipos y pruebas de concepto. Para reproducir esta solución en su propio entorno, siga estos pasos:
Configurar MongoDB en Atlas
Cree un clúster de Atlas y decida qué base de datos contendrá los datos de la estrategia.
En esta etapa, solo necesita 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
Clona el repositorio de GitHub e inicia el kehrnel.
Clona el repositorio e inicia el entorno ./startKehrnel de ejecución con. Este punto de entrada prepara automáticamente el entorno local y simplifica la primera ejecución.
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
Tras el arranque, confirme que el entorno de ejecución es accesible y utilice kehrnel como plano de control para el resto del flujo de trabajo.
Una vez iniciado, kehrnel expone un sitio Docusaurus en la ruta http://localhost:8080/guide. La figura 4 muestra el sitio.
Figura 4. Documentación de Kehrnel
Configure el contexto de la CLI y cree un entorno.
Dirija la interfaz de línea de comandos (CLI) al entorno de ejecución en curso, cree el entorno de destino e inspecciónelo. El entorno es la unidad de activación en kehrnel. Aísla la configuración de la estrategia, las vinculaciones, 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 múltiples entornos, dominios y estrategias. En este tutorial, seleccione explícitamente el dominio openehr y la estrategia openehr.rps_dual.
Utilice src/kehrnel/engine/strategies/openehr/rps_dual/defaults.json como configuración base y agregue un pequeño archivo de anulación solo cuando desee cambiar los nombres de las colecciones, las etiquetas de los campos, la habilitación de la búsqueda, los diccionarios, los separadores, las políticas de codificación o las asignaciones.
La activación es el paso en el que kehrnel materializa las colecciones configuradas y los índices B-tree de la configuración de la estrategia activa. Para el ejemplo de referencia empaquetado, el archivo de anulación de activación apunta a strategy hacia las asignaciones de proyección empaquetadas. A continuación, se aplica el arranque del diccionario según la configuración de activación de la estrategia.
Nota
Para comprender la superficie openehr.rps_dual de configuración completa de y los cambios admitidos que puede aplicar, consulte la guía de configuración de la estrategia. Esta guía explica qué controla cada ajuste en la línea base de la estrategia, incluidos los nombres de las colecciones, las etiquetas de los campos, la habilitación del lado de la búsqueda, las semillas del 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
Preparar plantillas, asignaciones y composiciones canónicas.
Trabaje con los recursos de muestra propiedad de la estrategia en src/kehrnel/engine/strategies/openehr/rps_dual/samples o con sus propias entradas canónicas de openEHR.
Utilice plantillas OPT para validar o generar composiciones.
Utilice las asignaciones de proyección empaquetadas cuando desee que la colección del lado de la búsqueda se construya a partir de la misma configuración que controla la ingesta y la generación del índice 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
Composiciones de ingestión
Ingiere composiciones a través de la estrategia. Los sobres NDJSON empaquetados son contenedores de composición canónicos de openEHR que incluyen la composición enmascarada más metadatos como ehr_id, template_id, composition_version y time_committed.
Aquí se utiliza kehrnel run ingest, mientras que este tutorial parte de sobres canónicos de openEHR y necesita la estrategia para producir el documento base semiplano y, cuando existen asignaciones para la plantilla, el documento de proyección opcional del lado de la búsqueda.
Las banderas de archivos locales que se muestran a continuación son solo una medida de seguridad que permite al entorno de ejecución leer el archivo NDJSON de muestra empaquetado desde su árbol de trabajo.
Cuando existen asignaciones para una plantilla, 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 documento auxiliar en lugar de emitir matrices vacías.
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"
Compilar e inspeccionar AQL
Compile el código AQL representativo antes de ejecutarlo.
Confirme 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 kehrnel se encarga de la traducción determinista y la planificación de la ejecución en función del 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
Ejecute una consulta específica para un paciente y una consulta que abarque varios pacientes en el mismo entorno. Esta ejecución demuestra el valor fundamental del patrón: una única superficie de consulta operativa, donde el entorno de ejecución elige la ruta de ejecución física adecuada para la carga de trabajo.
Para consultas centradas en el paciente, el entorno de ejecución puede dirigirse a la colección principal semiplana con etapas indexadas $match, $project, $sort y $limit. Para una recuperación operativa más amplia, el entorno de ejecución puede seguir la ruta orientada a la búsqueda cuando la estructura de la consulta lo permita.
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"
Explora los artefactos generados
Inspeccione los documentos de MongoDB generados, la proyección opcional del lado de la búsqueda y la definición del índice de Atlas Search para verificar el diseño basado en documentos.
Se puede observar cómo las composiciones canónicas siguen siendo la entrada de origen, cómo el formato semiplano admite consultas deterministas y cómo las asignaciones impulsan la proyección del lado de la búsqueda en lugar de duplicar ciegamente todo el documento.
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
Extienda el patrón a través de la CLI
Una vez que el flujo base funcione, continúe con la interfaz de línea de comandos (CLI) en lugar de pasar directamente a la configuración personalizada de la API. La CLI ya expone los principales componentes operativos:
Ciclo de vida del medio ambiente
Activación de la estrategia
Configuración del diccionario
Generación de índices de búsqueda
Compilación de consultas
Ejecución de consultas
Este conjunto de herramientas convierte a kehrnel en el plano de control natural para el trabajo estratégico. Se puede añadir una aplicación o interfaz de usuario independiente, pero la estrategia en sí misma sigue siendo portátil, inspeccionable y operable directamente a través del entorno de ejecución y la interfaz de línea de comandos.
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?Healthcare Data Lab se basa en 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 versión preliminar privada. Ponte en contacto con tu representante de cuenta de MongoDB para solicitar acceso.
Lecciones clave
Conservar composiciones como documentos semiplanos: Mantener un documento de MongoDB por composición, pero almacenarlo en un formato semiplano reconstruible en lugar de como una carga útil anidada sin procesar.
Codifique e invierta las rutas para una coincidencia eficiente: convierta las rutas estructurales de AQL en tokens invertidos compactos para
CONTAINSque pueda asignarse a predicados compatibles con prefijos.Enrutamiento AQL por ámbito: utilice
ehr_idpara mantener las consultas con ámbito de paciente localmente y enviar consultas entre pacientes a Atlas Search cuando sea apropiado.En función de la escala, elija una o dos colecciones: una única colección semiplanificada puede funcionar bien, pero los repositorios muy grandes se benefician de una proyección de búsqueda reducida.
Mantenga una única superficie de consulta operativa: permita que los equipos de desarrollo de aplicaciones sigan utilizando 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
Verifique los estándares de openEHR.
Consulte las especificaciones AQL de openEHR.