Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt; las versiones en Markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

Capa de persistencia de openEHR basada en documentos

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

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.

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.

Representación de una composición semiaplanada

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.

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_id y reversed_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.

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.

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.

Captura de pantalla de la CLI de Kehrnel

Figura 2. Captura de pantalla de la CLI de Kehrnel

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.

Representación de la arquitectura para el compilador AQL y el entorno de ejecución del enrutamiento

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.

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"
}
}
}
]
}

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.

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.

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:

  • FROM y CONTAINS se transforman en predicados de ruta estructural.

  • WHERE se convierte en predicados de valor en las cargas útiles de los nodos coincidentes.

  • SELECT se convierte en proyección.

  • ORDER BY se 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

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.

El MQL compilado sigue la misma lógica que el AQL:

  • El filtro ehr_id de nivel superior hace que el query sea por paciente.

  • La cláusula $all requiere que todas las bifurcaciones estructurales descritas por el AQL estén presentes en la misma composición.

  • Cada $elemMatch enlaza un predicado de ruta y su valor es predica del mismo nodo almacenado.

  • El predicado en p es la forma compilada de la lógica CONTAINS estructural.

  • 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 SELECT y ORDER 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"
}
}
]
}
}
}
]);

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"
}
}
]
}
}
}
}
]
}
}
}

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.

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:

1

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
2

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.

Documentación de Kehrnel

Figura 4. Documentación de Kehrnel

3

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
4

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
5

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
6

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"
7

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"
8

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"
9

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
10

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.

  • 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 CONTAINS pueda asignarlos a predicados que admitan prefijos.

  • Enrutar el AQL por alcance: usa ehr_id para 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.

  • Francesc Mateu Amengual, MongoDB

  • Giovanni Rodriguez, MongoDB

  • Greg Cox, MongoDB

  • Juan Crossley, MongoDB