구체화된 경로로 트리 구조 모델링하기
개요
이 페이지에서는 문서 간의 전체 관계 경로를 저장하여 MongoDB 문서에서 트리와 같은 구조를 설명하는 데이터 모델에 대해 설명합니다.
패턴
구체화된 경로 패턴은 문서에 각 트리 노드를 저장하며, 문서에는 트리 노드 외에도 노드의 조상 또는 경로의 ID를 문자열로 저장합니다. 구체화된 경로 패턴에는 문자열과 정규식으로 작업하는 추가 단계가 필요하지만 패턴을 사용하면 부분 경로로 노드 찾기와 같이 경로를 더욱 유연하게 사용할 수 있습니다.
다음과 같은 카테고리 계층 구조를 고려하세요:
다음 예제에서는 구체화된 경로를 사용하여 트리를 모델링하고 path
필드에 경로를 저장하며 경로 문자열은 쉼표 ,
를 구분 기호로 사용합니다.
db.categories.insertMany( [ { _id: "Books", path: null }, { _id: "Programming", path: ",Books," }, { _id: "Databases", path: ",Books,Programming," }, { _id: "Languages", path: ",Books,Programming," }, { _id: "MongoDB", path: ",Books,Programming,Databases," }, { _id: "dbm", path: ",Books,Programming,Databases," } ] )
필드
path
를 기준으로 정렬하여 전체 트리를 조회하도록 쿼리할 수 있습니다:db.categories.find().sort( { path: 1 } ) path
필드에서 정규식을 사용하여 다음과 같이Programming
의 하위 항목을 찾을 수 있습니다.db.categories.find( { path: /,Programming,/ } ) 또한,
Books
가 계층 구조의 최상위 수준에 있는Books
의 하위 항목을 검색할 수도 있습니다.db.categories.find( { path: /^,Books,/ } ) 필드
path
에 인덱스를 만들려면 다음 호출을 사용해야 합니다.db.categories.createIndex( { path: 1 } ) 이 인덱스는 쿼리에 따라 성능을 향상시킬 수 있습니다.
루트
Books
하위 트리에서 쿼리하는 경우(예:/^,Books,/
또는/^,Books,Programming,/
),path
필드의 인덱스는 쿼리 성능을 크게 향상시킵니다.쿼리에 루트로부터의 경로가 제공되지 않은 하위 트리 쿼리의 경우(예:
/,Databases,/
) 또는 이와 유사한 하위 트리 쿼리(노드가 인덱싱된 문자열의 중간에 있을 수 있는 경우)의 경우 쿼리는 전체 인덱스를 검사해야 합니다.이러한 쿼리의 경우 인덱스가 전체 collection보다 현저히 작은 경우 인덱스가 약간의 성능 향상을 제공할 수 있습니다.