제품: MongoDB Atlas, MongoDB Atlas Search
파트너: openEHR
솔루션 개요
openEHR은 애플리케이션과 데이터베이스가 발전하더라도 임상 기록을 구조화하여 의학적 의미가 일관적인 되게 유지되도록 하는 방법입니다. 이는 기록 의 안정적인 기술적 구조를 관찰, 약품 또는 진단과 같은 실제 개념을 모델링하는 데 사용되는 임상 정의와 분리합니다.
기술적으로 openEHR은 모델 중심의 EHR 아키텍처입니다. 참조 모델은 임상 기록의 안정적인 구조를 정의하는 반면, 아키타입과 템플릿은 임상적 의미와 구현 제약 조건을 추가합니다. 프라이머리 기록 단위는 COMPOSITION AQL을 통해 콘텐츠가 쿼리되는 계층적 의료 문서 인 입니다. AQL은 저장 모델과 독립적입니다. 중첩된 임상 구조 위에 SQL 유사 절을 계층적 경로 및 술어와 결합합니다.CONTAINS 이러한 쿼리를 효율적으로 확장 과제 수 있습니다.
실제로 openEHR 리포지토리 다음 쿼리 패밀리를 지원 해야 하는 경우가 많습니다. 첫 번째는 단일 환자 검색에 해당합니다( 예시 : 알려진 환자의 차트 열거나 하나의 EHR 내에서 특정 임상 문서 검색하는 경우). 두 번째 작업에는 환자 간 운영 검색( 예시 : 코호트 구축, 안전 규칙을 충족하는 환자 찾기, 워크리스트 생성, 의료 제공 중 유사한 사례 식별)이 포함됩니다. 이러한 운영 쿼리는 애플리케이션 워크플로에 가깝게 실행 되어야 하며 지연 시간 짧고 예측 가능해야 합니다.
많은 구현에서 두 쿼리 패턴을 모두 효율적으로 지원 데 어려움을 겪습니다. 관계형 접근 방식은 환자 범위 검색에 적합할 수 있지만, 대규모 환자 간 쿼리는 조인, 스키마 변동 및 템플릿 변형으로 인해 압박을 받는 경우가 많습니다. 이러한 워크로드를 별도의 분석 플랫폼으로 오프로드하면 소급 분석 에 도움이 될 수 있지만 중복이 생성되고, 지연 시간 추가되고, 거버넌스 및 감사 추적이 조각화되고, 통합 AQL 쿼리 인터페이스의 목표가 약해집니다. 또한 문서가 너무 적극적으로 평면화되면 관련 임상 컨텍스트를 제거 할 수 있습니다.
임상 쿼리 제품군 조정
이 솔루션은 MongoDB 에서 문서 우선, 반 평면화된 지속성 모델을 통해 이러한 문제를 해결합니다. 반 평면화 는 각 요소를 배열 의 노드 로 평면화하지만 각각이 원래 구조의 전체 JSON 페이로드를 유지한다는 의미입니다. 문서 우선은 각 openEHR 구성이 아키텍처당 하나의 테이블이나 경로당 하나의 행으로 분해되지 않고 하나의 MongoDB 문서 로 보존됨을 의미합니다. 동시에 구성은 재구성 가능한 노드 배열 로 구체화되어 운영 단위인 구성을 포기하지 않고도 효율적인 경로 기반 쿼리를 가능하게 합니다.
각 저장된 노드 다음과 같은 키 요소를 유지합니다.
로컬 임상 하위 트리이므로 원래의 의미와 컨텍스트를 계속 사용할 수 있습니다.
위치 메타데이터 이므로 구조와 순서를 재구성할 수 있습니다.
역 AQL 경로로 가변 깊이 경로 제약 조건을 효율적으로 일치시킬 수 있습니다.
역방향 경로는 환자 범위 및 교차 환자 실행 경로 모두에서 구조적 조건자를 효율적으로 평가하는 데 사용되는 일반 쿼리 키입니다. 검색 인덱스의 정규식 기반 일치 및 와일드카드 스타일 경로 확인을 포함하여 다양한 실행 전략에서 경로가 제한된 일치를 지원합니다. 조건자가 다른 텍스트 경로 구성 요소 또는 텍스트 조건을 사용할 때 동일한 쿼리 패턴을 적용할 수 있습니다.
이 모델을 사용하면 AQL 절을 MongoDB 쿼리 단계로 결정론적으로 컴파일할 수 있습니다. FROM, CONTAINS 및 WHERE 제약 조건은 노드 경로 및 값에 대한 대상 조건자가 됩니다. 이 접근 방식은 구성을 프라이머리 임상 컨테이너 로 그대로 유지하면서 확장하다 운영 검색을 실용적으로 만듭니다.
그림 1. 각 노드 고유한 컨텍스트와 값과 반전된 AQL 경로를 전달하는 반평면화된 구성을 나타냅니다.
참고
아키텍처 및 평가에 대한 간결하게 게시된 요약을 보려면 동료 심사를 거친 컨퍼런스 요약을 참조하세요. 반 평면화된 지속성 모델, 결정론적 AQL에서 MQL 로의 컴파일 및 벤치마크 세부 정보를 포함한 전체 설계는 전체 기술 문서를 참조하세요.
워크로드별 라우팅
많은 리포지토리의 경우 반 평면화된 단일 컬렉션 과 와일카드 인덱스로 충분합니다. 대규모 배포의 경우 이 모델은 광범위한 환자 간 필터링에 필요한 데이터만 포함하는 슬림 검색 프로젝션 사용할 수 있습니다. 그러면 쿼리 실행이 범위별로 라우팅됩니다. 슬림 검색 프로젝션 은 광범위한 환자 간 필터링에 필요한 노드 필드만 저장하는 더 작은 파생 컬렉션 입니다. 기본 구성 문서 대체하지 않습니다. 광범위한 운영 쿼리에 대한 인덱스 범위와 검색 비용 줄입니다.
따라서 다음과 같은 양식을 제공합니다.
환자 범위 쿼리는
ehr_id및reversed_path와 같은 필드에 대한 복합 인덱스 와 같은 대상 인덱스를 사용하여 기본 구성 컬렉션 에서 실행 .교차 환자 쿼리는 더 슬림해진 프로젝션, 컴파일 경로 제약 조건을 와일드카드 또는 역경로의 일치 항목으로, 값 술어를 동등성, 범위 또는 검색 연산자로 실행 .
이 실행 모델은 단일 쿼리 인터페이스를 제공하여 워크로드 크기와 선택도에 따라 다양한 물리적 액세스 경로를 허용합니다.
운영 코호트 쿼리 지원이 중요한 이유
최신 의료 애플리케이션은 동일한 플랫폼에서 두 쿼리 제품군을 모두 필요로 하는 경우가 증가하고 있습니다. 의사는 하나의 환자 기록 즉시 열어 다음과 같은 질문을 해야 할 수 있습니다.
어떤 환자가 주어진 창 동안 특정 약을 받았습니까?
어떤 환자가 프로토콜 또는 안전 규칙과 일치하나요?
이 사례와 임상적으로 유사한 이전 사례는 무엇인가요?
이러한 운영 관련 질문에는 반복적인 ETL 주기를 통해 데이터를 별도의 시스템으로 푸시하지 않고 답변이 필요합니다.
문서 우선, 반 평면화 모델은 openEHR의 장점을 보존하고 이러한 워크로드를 실용적으로 만듭니다. 구성을 신뢰할 수 있는 운영 단위로 유지하고, 재구성 가능한 구조를 통해 의료 충실도를 보존하며, 애플리케이션 팀이 환자 중심의 저장 와 별도의 교차 환자 플랫폼 중에서 선택해야 하는 상황을 방지합니다. 더 작은 리포지토리는 하나의 반 평면화된 컬렉션 으로 간단하게 유지할 수 있습니다. 리포지토리가 클수록 프로젝션 더 작게 추가하여 광범위한 운영 필터링 비용 줄일 수 있습니다.
평가 결과, 이 접근 방식은 두 워크로드 유형 모두에서 낮은 엔드 투 엔드 지연 시간 유지했으며, 확장하다 에서도 환자 범위 및 교차 환자 쿼리에 대한 응답 시간이 짧습니다. 이러한 효율성 단일 플랫폼에서 운영 검색, 출처 인식 처리, 시맨틱 강화 및 AI 기반 워크플로를 지원 해야 하는 openEHR 리포지토리의 실용적인 기반으로 검증되었습니다.
참고
프로덕션 증명 점: 이 아키텍처는 1.2 개 이상의 영구 문서가 있는 리포지토리 의 프로덕션 환경에서 검증되었습니다.
문서 우선 임상 데이터 전략을 위한 실험적 참고 런타임이자 툴킷인 kehrnel을 사용하여 이 패턴 탐색할 수 있습니다.
이 접근 방식을 따르면 다음과 같은 실질적인 이점이 있습니다.
구성 충실도를 유지하는 재구성 가능한 반 평면화된 모델입니다.
임상 문서 의 관계형 파쇄를 강제하지 않고 효율적인 환자 범위 쿼리 .
창고 우선 아키텍처를 기본값으로 사용하지 않고 교차 환자 운영 조회를 지원합니다.
중복된 저장소와 조각난 로직 대신 애플리케이션 팀을 위한 하나의 운영 쿼리 표면입니다.
ETL 오버헤드 줄이고, 거버넌스 드리프트를 줄이고, 총 소유 비용 줄일 수 있는 방법입니다.
Kernel이란 무엇이며 왜 사용하나요?
Kernel은 의료 데이터 모델을 운영 기능으로 전환하는 전략 런타임입니다. Kernel이 존재하는 이유는 의료 데이터 모델 정의하는 것만으로는 충분하지 않기 때문입니다. 또한 팀에는 데이터의 유효성을 검사하고, 데이터를 운영 표현으로 변환하고, 수집하고, 쿼리 , 유지 관리하고, 요구 사항 변경에 따라 발전시키는 반복 가능한 방법이 필요합니다. 해당 실행 계층이 없으면 모델은 문서, 저장 스키마 또는 격리된 사양으로 남아 있는 경우가 많습니다.
목표는 openEHR 엔진 구축하는 것보다 더 광범위합니다. Kernel은 API, 도구, AI 워크플로에서 의료 데이터 모델을 실행하고, 검사하고, 재사용할 수 있도록 반복 가능한 문서 우선 접근 방식을 제공합니다. 시간이 지남에 따라 동일한 런타임 패턴 FHIR, 합성 데이터 워크플로, 시맨틱 카탈로그, 언어 검색 및 기타 도메인별 도구를 포함한 다른 모델 군 및 운영 전략을 지원 수 있습니다.
Kernel은 각 지속성 전략의 요구 사항에 맞게 사용자 지정할 수 있는 노출된 워크플로를 중심으로 설계되었습니다. 각 전략은 일관적인 런타임 모델을 사용하면서 고유한 활성화, 유효성 검사, 수집, 변환, 쿼리 , 합성 데이터 및 유지 관리 작업을 정의할 수 있습니다.
openEHR은 까다롭고 시맨틱이 풍부한 모델이기 때문에 Kernel은 openEHR로 시작합니다. 여기에는 아키타입, 템플릿, 경로, 용어 및 복잡한 쿼리 동작이 포함됩니다. 이는 모델 기반 런타임 접근 방식을 증명하기 위한 강력한 기반이 됩니다.
이 솔루션에서 Kernel은 문서 우선 지속성 패턴 에 대한 참조 런타임 및 툴킷 역할을 합니다.
그림 2. Kernel CLI 스크린샷
참조 아키텍처
그림 3 은 표준 openEHR 입력부터 라우트된 쿼리 실행에 이르기까지 kehrnel에서 이 전략의 엔드 투 엔드 흐름을 보여줍니다.
그림 3. AQL 컴파일러 및 라우팅 런타임(kehrnel)
1계층: 데이터 소스는 표준 openEHR 구성, 운영 템플릿의 모델 카탈로그, 확장하다 테스트에 사용되는 선택적 합성 데이터로 시작합니다.OPT는 아키타입과 템플릿에서 파생된 컴파일된 런타임 아티팩트입니다. 운영 시스템은 유효성 검사 및 경로 인식 처리 위해 OPT를 사용합니다.
2계층: 변환 파이프라인 들어오는 각 구성을 이 전략에서 사용하는 영구 표현으로 변환합니다. 세미 플랫화 단계에서는 구성 계층 구조를 스캔하고, 경로 및 코드 인코딩을 적용하고, 매핑 규칙을 사용하여 쿼리 가능 노드를 구체화합니다. 결과는 로컬 임상 하위 트리, 위치 메타데이터 및 역방향 경로 키를 유지하는 저장된 노드와 함께 구성당 하나의 반 평면화된 MongoDB 문서 생성합니다.
3계층: 사전과 매핑은 이 전략에 필요한 헬퍼 아티팩트를 저장 . _codes 및 _shortcuts 는 압축 경로 확인 및 인코딩을 지원 . 매핑은 변환 및 쿼리 컴파일을 주도하는 전략별 규칙을 저장 .
4계층: MongoDB 컬렉션은 지속성 옵션을 표시합니다. 프라이머리 작곡 컬렉션 반 평면화된 작곡 문서를 저장하고 및 에 대한 복합 인덱스 통해 환자 범위의 실행을 ehr_id cn.p제공합니다. 대규모 리포지토리의 경우 선택적 검색 컬렉션 교차 환자 필터링에 필요한 노드 데이터 포인트의 슬림 프로젝션 저장합니다. 이 컬렉션 MongoDB Atlas Search로 인덱싱됩니다. 이중 컬렉션 패턴 검색 매핑의 범위를 좁히고 검색 비용 더 낮춥니다.
5계층: 쿼리 엔진 은 kehrnel이 AQL을 구문 분석하고 라우팅하는 곳입니다. 런타임은 AQL 성명서 수락하고, AST의 유효성을 검사하고, 별칭 및 ehr_id 안전한 프로젝션을 확인하고, 쿼리 환자 범위인지 또는 교차 환자인지를 감지하고, 적절한 MQL 경로를 $match $project$sort $limit내보냅니다. 쿼리 가 포함된 경우 런타임은 embeddedDocument wildcardrange일반적으로,,, 등의 단계를 사용하여 작곡 equals 컬렉션 에 대해 환자 범위 집계 파이프라인 내보냅니다. 쿼리 가 교차 환자(cross-Patient) 쿼리인 경우 런타임은 복합 필터하다 내부의,,, 등의 연산자를 사용하여 슬림 프로젝션 통해 검색 우선 파이프라인 내보냅니다.template/time/order 조건자가 일치하는 경우 기본 컬렉션 에 대한 일부 교차 환자 쿼리를 유지할 수 있습니다.
6계층: 런타임 인터페이스는 kehrnel CLI 와 HTTP API 모두 통해 이 전략을 노출합니다. CLI 환경 설정, 전략 활성화, 컴파일, 쿼리 실행 등의 연산자 워크플로를 지원합니다. API 통합, 자동화 및 대화형 문서에 동일한 런타임 기능을 노출합니다.
이 계층형 설계는 애플리케이션 팀에 하나의 논리적인 운영 쿼리 표면을 제공하고 리포지토리 크기, 쿼리 범위, 워크로드 선택성에 따라 다양한 액세스 경로를 가능하게 합니다.
데이터 모델 접근 방식
각 구성을 반 평면화된 형태로 유지되는 하나의 MongoDB 문서 로 저장합니다. 각 저장된 노드 에는 다음이 포함됩니다.
로컬 임상 하위 트리
역방향 경로 키
재구성을 위한 위치 메타데이터
이 구조는 모델을 문서 우선 및 확장하다 쿼리 가능하게 만듭니다. 아키텍처 유형별 테이블 레이아웃을 생성하고 모든 쿼리 원래 중첩된 JSON 형태만 사용하도록 강제하는 것을 방지할 수 있습니다.
이 모델에서는 openEHR 경로가 최고 수준으로 유지됩니다. 영구 문서 구성을 연산 단위로 유지하고, 노드 배열 컴파일러에게 쿼리 결정론적 구조를 제공합니다.
다음의 간소화된 문서 읽기 가능한 지속형 구성 예시 보여줍니다. 설명을 위한 형식이므로 간결한 프로덕션 인코딩보다 필드 이름과 경로 값을 따르기가 더 쉽습니다.
{ "_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" } } } ] }
이 문서를 읽는 방법
하나의 MongoDB 문서 하나의 openEHR 구성을 나타냅니다. cn 배열 해당 구성에서 추출한 쿼리 가능 노드를 저장합니다. 각 노드 data에 로컬 임상 하위 트리, p에 역방향 경로 키, kp, pi, bk 와 같은 위치 메타데이터 유지하여 원래 구조를 재구성할 수 있습니다.
공개 예시 번역을 더 쉽게 따라할 수 있도록 경로 키를 읽을 수 있는 형식으로 표시합니다. 프로덕션 환경에서는 사전 인코딩된 컴팩트 토큰과 동일한 경로를 저장 경로 크기와 인덱스 공간을 줄일 수 있습니다.
역경로 인코딩
저장된 경로 필드 키 최적화를 나타냅니다. 참조 모델 속성과 아키타입 노드 식별자는 openEHR 경로를 빌드 . 이 솔루션은 역방향 저장된 경로를 사용하므로 선행 와일드카드 스캔 대신 접두사 친화적인 매칭으로 제약 조건을 평가할 수 있습니다. 이 설정 환자 범위 경로에서는 표준 정규식 기반 일치와 함께 작동하고 검색 경로에서는 와일드카드 스타일의 일치와 함께 작동합니다.
결정론적 AQL에서 MQL 로 변환
AQL은 스토리지 모델과 독립적이므로 결정론적 컴파일이 효과적입니다. SQL 절은 다음과 같이 MQL 로 변환됩니다.
FROM및CONTAINS은 구조적 경로 술어가 됩니다.WHERE일치하는 노드 페이로드에서 값 조건자가 됩니다.SELECT프로젝션 됩니다.ORDER BY정렬이 됩니다.
다음 예시 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
이 AQL이 요구하는 것
이 쿼리 구조적 제약 조건과 값 기반 제약 조건을 결합합니다. CONTAINS 절은 필요한 openEHR 구조를 정의하며, 이 경우에는 관리 클러스터 및 복약 조치 포함하는 예방 접종 구성이 포함됩니다. 그런 다음 WHERE 절은 조치 시간, 수행자 식별자 및 관리 코드에 대한 조건자를 추가합니다.
이 쿼리 유형은 결정론적 컴파일의 이점을 누립니다. 계층적 임상 구조와 노드 로컬 값에 대한 조건을 표현합니다.
컴파일러가 AQL을 MQL 에 매핑하는 방법
컴파일된 MQL AQL과 동일한 로직을 따릅니다.
최상위
ehr_id필터하다 쿼리 환자 범위로 만듭니다.$all절에서는 AQL에 설명된 모든 구조 분기가 동일한 구성에 있어야 합니다.각
$elemMatch은 경로 술어와 해당 값 술어를 동일한 저장된 노드 에 바인딩합니다.p의 조건자는 구조적CONTAINS로직의 컴파일된 형식입니다.데이터 아래의 조건자는
WHERE조건의 컴파일된 형식입니다.전체 파이프라인 에서 컴파일러는
SELECT및ORDER BY에 해당하는 프로젝션 및 정렬 단계를 추가합니다.
다음 예시 위의 AQL 쿼리 에서 생성된 간소화된 환자 범위 MQL 패턴 보여줍니다. 이는 바이트 단위의 런타임 페이로드가 아닌 컴파일러 로직을 보여줍니다.
// 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" } } ] } } } ]);
동일한 로직이 검색 경로로 이동하는 방법
논리적 번역은 환자 간 경로에서 동일하게 유지됩니다. 차이점은 물리적 실행입니다. 컴파일러는 주요 작곡 컬렉션 에서 일치하는 대신 슬림 검색 프로젝션 대상으로 합니다. 역방향 경로에 대한 구조적 제약 조건은 와일드카드 필터가 되고 값 조건자는 범위 및 동등 필터가 됩니다.
다음 예시 한 환자에게 바인딩되지 않은 AQL에서 생성된 MQL 패턴 보여줍니다. 이전과 마찬가지로 바이트 단위 런타임 페이로드가 아닌 컴파일러 로직을 보여줍니다.
{ "$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" } } ] } } } } ] } } }
반복되는 구조 및 동일 경로 형제
일부 openEHR 구조에는 동일한 유효 경로를 가진 반복되는 형제 노드가 포함될 수 있습니다( 예시 : 반복되는 EVENTs). 이러한 경우에는 컴파일러가 조건자를 더 깊게 밀어넣어 동일한 반복 항목이 조건을 충족하도록 해야 합니다. 표준 집계 에서 이는 $elemMatch이 더 깊게 중첩되었음을 의미합니다. 검색 경로에서 이에 상응하는 것은 embeddedDocument이며, 이는 여러 조건을 동일한 내장된 배열 요소에 바인딩합니다.
솔루션 빌드
이 리포지토리 에서 사용할 수 있는 kehrnel을 이 패턴 의 참조 런타임 및 툴킷으로 사용합니다. Kernel은 표준 openEHR 구성을 수집하고 올바른 실행 경로를 통해 운영 쿼리를 라우팅하는 데 사용되는 전략 수명 주기, 유효성 검사 흐름, 세미 플랫화 파이프라인 및 AQL 컴파일 경로를 제공합니다.
활성화 시 kehrnel은 manifest.json를 통해 전략을 노출하고, defaults.json 를 활성화 기준으로 사용하고, schema.json로 재정의의 유효성을 검사하고, 전략 구현 및 spec.json에 설명된 저장 및 인덱스 계획을 적용합니다. 권장 경로는 MongoDB 에서 먼저 수동으로 생성하는 대신 kehrnel이 활성 구성에서 컬렉션과 B-트리 인덱스를 생성하도록 하는 것입니다.
리포지토리 kehrnel을 데모, 교육, 래피드 프로토타이핑 및 개념 증명을 위한 실험적 런타임으로 포지셔닝합니다. 사용자 환경에서 이 솔루션을 재현하려면 다음 단계를 따르세요.
Atlas 에서 MongoDB 설정
Atlas cluster 생성하고 전략 데이터를 저장할 데이터베이스 결정합니다.
이 단계에서는 대상 데이터베이스 이름과 연결 문자열 만 필요합니다.
MacOS 및 Linux 의 경우:
export MONGODB_URI="<your-atlas-connection-string>" export MONGODB_DB="openEHR_demo"
Windows Powershell의 경우:
set MONGODB_URI=<your-atlas-connection-string> set MONGODB_DB="openEHR_demo" exit
GitHub 리포지토리 복제하고 kehrnel을 시작합니다.
리포지토리 를 ./startKehrnel 복제하고 로 런타임을 시작합니다. 이 진입점은 로컬 환경을 자동으로 준비하고 첫 번째 실행 간단하게 유지합니다.
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
스타트업 후 런타임에 연결할 수 있는지 확인하고 나머지 워크플로의 제어 영역으로 kehrnel을 사용합니다.
일단 시작되면 kehrnel은 http://localhost:8080/ 가이드 경로에 Docusaurus 사이트 노출합니다. 그림 4 는 사이트 보여줍니다.
그림 4. Kernel 문서
CLI 컨텍스트 구성 및 환경 생성
CLI 로 실행 런타임을 가리키고 대상 환경을 만든 다음 검사합니다. 환경은 kehrnel에서 활성화 단위입니다. 전략 코드를 강제로 변경하지 않고 전략 구성, 바인딩, 생성된 아티팩트 및 작동 상태 격리합니다.
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
전략 검색 및 활성화
Kernel은 여러 환경, 도메인 및 전략을 지원합니다. 이 연습에서는 openehr 도메인과 openehr.rps_dual 전략을 명시적으로 선택합니다.
src/kehrnel/engine/strategies/openehr/rps_dual/defaults.json 를 기준 구성으로 사용하고 컬렉션 이름, 필드 레이블, 검색 활성화, 사전, 구분 기호, 코딩 정책 또는 매핑을 변경하려는 경우에만 작은 재정의 파일 추가합니다.
활성화는 kehrnel이 활성 전략 구성에서 구성된 컬렉션과 B-트리 인덱스를 구체화하는 단계입니다. 패키지된 참조 예시 의 경우 활성화 재정의 파일 strategy 가 패키지된 프로젝션 매핑을 가리킵니다. 그런 다음 전략의 활성화 설정에 따라 사전 부트스트랩이 적용됩니다.
참고
전체 구성 표면과 적용 할 수 있는 지원되는 변경 openehr.rps_dual 사항을 이해하려면 전략 구성 가이드 참조하세요. 이 가이드 컬렉션 이름, 필드 레이블, 검색 사이드 활성화, 딕셔너리 시드, 경로 구분 기호, 코딩 정책 등 전략 기준선의 각 설정이 제어하는 사항에 대해 설명합니다.
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
템플릿, 매핑 및 표준 구성 준비
src/kehrnel/engine/strategies/openehr/rps_dual/samples 에서 전략 소유의 샘플 자산으로 작업하거나 자체 표준 openEHR 입력으로 작업하세요.
OPT 템플릿을 사용하여 작곡을 검증하거나 생성합니다.
수집 및 검색 인덱스 생성을 구동하는 것과 동일한 구성에서 검색 사이드 컬렉션 구축하려는 경우 패키지된 프로젝션 매핑을 사용합니다.
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
컴포지션 수집
전략을 통해 작곡을 수집합니다. 패키지된 NDJSON 엔벨로프는 표준 openEHR 구성 래퍼로, 마스킹된 구성과 ehr_id, template_id, composition_version, time_committed 등의 메타데이터 포함합니다.
여기서는 kehrnel 실행 수집을 사용하며, 이 안내에서는 표준 openEHR 엔벨로프에서 시작하여 반 평면화된 기본 문서 와 템플릿에 대한 매핑이 있는 경우 선택적 검색 사이드 프로젝션 문서 생성하기 위한 전략이 필요합니다.
아래의 로컬 파일 플래그는 런타임이 작업 트리에서 패키징된 샘플 NDJSON을 읽을 수 있도록 하는 가드레일일 뿐입니다.
템플릿에 대한 매핑이 있는 경우 kehrnel은 compositions_search에 선택적 검색 사이드 문서 도 생성합니다. 템플릿에 대한 매핑이 없는 경우 빈 배열을 내보내는 대신 해당 사이드카를 건너뜁니다.
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"
AQL 컴파일 및 검사
실행하기 전에 대표 AQL을 컴파일합니다.
확인된 범위, 방출된 MQL 및 선택한 실행 경로를 확인합니다.
이 컴파일 단계는 패턴 의 주요 운영 계약입니다. 애플리케이션은 AQL을 기반으로 하고 kehrnel은 저장 모델에 대해 결정론적 변환 및 실행 계획을 처리합니다.
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"
운영 쿼리 실행
동일한 환경에 대해 환자 범위 쿼리 와 교차 환자 쿼리 모두 실행합니다. 이 실행은 런타임이 워크로드 에 적합한 물리적 실행 경로를 선택하는 하나의 운영 쿼리 표면 패턴 의 핵심 가치를 보여줍니다.
환자 범위 쿼리의 경우 런타임은 인덱싱된 $match, $project, $sort 및 $limit 단계가 있는 반 평면화된 기본 컬렉션 대상으로 지정할 수 있습니다. 더 광범위한 운영 조회를 위해 런타임은 쿼리 형태 도움이 될 때 검색 지향 경로를 통해 라우팅할 수 있습니다.
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"
생성된 아티팩트 살펴보기
생성된 MongoDB 문서, 선택적 검색 사이드 프로젝션 및 Atlas Search 인덱스 정의를 검사하여 문서 우선 설계를 확인합니다.
표준 구성이 소스 입력으로 유지되는 방법, 반 평면화된 양식이 결정론적 쿼리를 지원하는 방법, 매핑이 전체 문서 맹목적으로 복제하는 대신 검색 사이드 프로젝션 구동하는 방법을 확인할 수 있습니다.
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
CLI 통해 패턴 확장
기본 흐름이 작동하면 사용자 지정 API 연결로 바로 이동하지 말고 CLI 를 계속 사용하세요. CLI 이미 주요 운영 빌딩 블록을 노출하고 있습니다.
환경 수명 주기
전략 활성화
사전 설정
검색 인덱스 생성
쿼리 컴파일
쿼리 실행
이 툴킷은 kehrnel을 전략 작업을 위한 자연스러운 컨트롤 플레인으로 만듭니다. 별도의 애플리케이션 이나 UI 그 위에 놓을 수 있지만 전략 자체는 런타임과 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
참고
안내식 샌드박스에서 이 패턴 실험해 보고 싶으신가요?의료 데이터 랩은 kehrnel을 기반으로 팀이 이러한 openEHR 지속성 접근 방식을 포함하여 문서 우선 의료 데이터 전략을 모델링, 쿼리 및 테스트할 수 있도록 지원합니다. 현재 비공개 미리 보기로 제공됩니다. 액세스 요청 하려면 MongoDB 계정 담당자에게 문의하세요.
주요 학습 사항
컴포지션을 반 평면화된 문서로 유지: 구성당 하나의 MongoDB 문서 유지하되, 원시 중첩 페이로드가 아닌 재구성 가능한 반 평면화된 형태로 저장 .
효율적인 매칭을 위한 경로 인코딩 및 역방향: AQL 구조 경로를 컴팩트한 역방향 토큰으로 변환하여 가
CONTAINS접두사 친화적인 술어에 매핑할 수 있도록 합니다.범위별 AQL 라우팅: 를 사용하여
ehr_id환자 범위 쿼리를 로컬로 유지하고 적절한 경우 교차 환자 쿼리를 Atlas Search 로 보냅니다.확장하다 에 따라 컬렉션 1~2개 선택: 반 평면화된 단일 컬렉션 도 잘 작동할 수 있지만, 대규모 리포지토리의 경우 슬림한 검색 프로젝션 의 이점을 누릴 수 있습니다.
하나의 운영 쿼리 표면 유지: 런타임이 결정론적 컴파일 및 실행 계획을 처리하는 동안 애플리케이션 팀이 AQL을 유지할 수 있습니다.
작성자
Francesc Mateu Amengual, MongoDB
Giovanni Rodriguez, MongoDB
그렉 콕스, MongoDB
MongoDB , Juan Crossley