데이터베이스 참조
이 페이지의 내용
MongoDB의 많은 사용 사례에서 관련 데이터가 단일 문서 내에 저장되는 비정규화된 데이터 모델이 최적입니다. 그러나 경우에 따라서는 관련 정보를 별도의 문서, 일반적으로 서로 다른 컬렉션이나 데이터베이스에 저장하는 것이 합리적일 수 있습니다.
중요
$lookup
파이프라인 단계를 사용하여 동일한 데이터베이스의 샤딩되지 않은 collection에 왼쪽 외부 조인을 수행할 수 있습니다.
$graphLookup
파이프라인 단계를 사용하여 샤딩되지 않은 collection을 조인해 재귀 검색을 수행할 수도 있습니다.
이 페이지에서는 $lookup
및 $graphLookup
파이프라인 단계 이전의 대체 절차에 대해 설명합니다.
다음 환경에서 호스팅되는 배포에 대한 데이터베이스 참조를 생성할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
MongoDB 애플리케이션은 두 가지 방법 중 하나를 사용하여 문서를 연관시킵니다.
수동 참조는 한 문서의
_id
필드를 다른 문서에 참조로 저장합니다. 애플리케이션에서 두 번째 쿼리를 실행하여 관련 데이터를 반환합니다. 이러한 참조는 간단하고 대부분의 사용 사례에 충분합니다.DBRefs는 첫 번째 문서의
_id
필드의 값, 컬렉션 이름, 해당 데이터베이스 이름(선택 사항) 및 기타 필드를 사용하여 한 문서에서 다른 문서로 참조한 것입니다. DBRefs를 사용하면 여러 컬렉션 또는 데이터베이스에 저장된 문서를 보다 쉽게 참조할 수 있습니다.
DBreFS를 해석하려면 애플리케이션에서 추가 쿼리를 수행하여 참조된 문서를 반환해야 합니다. 일부 MongoDB 드라이버는 DBRefs를 문서로 해석할 수 있도록 헬퍼 메서드를 제공하지만 자동으로 수행되지는 않습니다.
DBRef는 문서 간의 관계를 나타내는 공통 형식과 유형을 제공합니다. 데이터베이스가 여러 프레임워크 및 도구와 상호 작용해야 하는 경우 DBRef 형식은 문서 간의 연결을 표시하는 공통의 시맨틱도 제공합니다.
DBRef를 사용해야 할 특별한 이유가 없다면 대신 수동 참조를 사용하세요.
수동 참조
배경
수동 참조는 한 문서의 _id
필드를 다른 문서에 포함하는 관행입니다. 그런 다음 애플리케이션은 필요에 따라 참조된 필드를 확인하기 위해 두 번째 쿼리를 실행할 수 있습니다.
MongoDB Atlas UI에서 수동 참조 만들기
MongoDB Atlas UI에서 수동 참조를 만들려면 다음 단계를 따르세요.
MongoDB Atlas UI 에서 Clusters 프로젝트 의 페이지로 이동합니다.
아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 원하는 프로젝트가 포함된 조직을 선택합니다.
아직 표시되지 않은 경우 내비게이션 바의 Projects 메뉴에서 프로젝트를 선택합니다.
아직 표시되지 않은 경우 사이드바에서 Clusters 을(를) 클릭합니다.
Clusters(클러스터) 페이지가 표시됩니다.
의 항목을 참조하는 컬렉션 에 문서 를 people
places
추가합니다.
왼쪽 탐색 창에서 다른 컬렉션을 선택합니다. 이 예에서는
people
컬렉션을 참조합니다.Insert Document를 클릭합니다.
JSON 뷰 아이콘({{}})을 클릭합니다.
다음 데이터를 문서에 붙여넣습니다.
{ "_id": { "$oid": "651aebeb70299b120736f443" }, "name": "Erin", "places_id": "651aea5870299b120736f442" "url": "bc.example.net/Erin" } Insert를 클릭합니다.
쿼리가
people
컬렉션에서 문서를 반환할 때 필요한 경우places_id
필드가 참조하는 문서에 대한places
컬렉션의 쿼리 결과를 필터링할 수 있습니다.MongoDB Atlas에서 쿼리를 실행하는 방법에 대해 자세히 알아보려면 MongoDB Atlas 문서에서 문서 보기, 필터링 및 정렬을 참조하세요.
터미널에서 수동 참조 생성
첫 번째 문서의 _id
필드를 두 번째 문서의 참조로 사용하여 두 문서를 삽입하려면 다음 작업을 고려하세요.
original_id = ObjectId() db.places.insertOne({ "_id": original_id, "name": "Broadway Center", "url": "bc.example.net" }) db.people.insertOne({ "name": "Erin", "places_id": original_id, "url": "bc.example.net/Erin" })
그런 다음 쿼리가 people
collection에서 문서를 반환하면 필요한 경우 places
collection의 places_id
필드에서 참조하는 문서에 대해 두 번째 쿼리를 만들 수 있습니다.
다음을 사용하세요.
두 문서 사이의 관계를 저장하려는 경우 대부분 수동 참조를 사용합니다. 참조는 생성하기 간단하며 애플리케이션은 필요에 따라 참조를 확인할 수 있습니다.
수동 연결의 유일한 제한 사항은 이러한 참조가 데이터베이스 및 컬렉션 이름을 전달하지 않는다는 것입니다. 둘 이상의 컬렉션에 있는 문서와 관련된 단일 컬렉션 문서가 있는 경우 DBRefs 사용을 고려해야 할 수 있습니다.
DBRefs
배경
DBRef는 특정 참조 유형이 아닌 문서를 나타내기 위한 규칙입니다. 여기에는 _id
필드의 값 외에도 컬렉션 이름, 경우에 따라 데이터베이스 이름이 포함됩니다.
선택적으로 DBRef에는 다른 필드를 얼마든지 포함할 수 있습니다. 추가 필드 이름은 서버 버전에서 지정한 필드 이름 규칙을 따라야 합니다.
형식
DBRef에는 다음과 같은 필드가 있습니다:
$ref
$ref
필드에는 참조된 문서가 있는 컬렉션의 이름이 있습니다.
$id
$id
필드에는 참조된 문서의_id
필드 값이 포함되어 있습니다.
$db
선택 사항.
참조된 문서가 있는 데이터베이스의 이름을 포함합니다.
예시
DBRef 문서는 다음 문서와 유사합니다.
{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }
creator
필드에 DBRef를 저장한 collection의 문서를 예로 들어 보겠습니다.
{ "_id" : ObjectId("5126bbf64aed4daf9e2ab771"), // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId("5126bc054aed4daf9e2ab772"), "$db" : "users", "extraField" : "anything" } }
이 예시의 DBRef는 _id
필드에 ObjectId("5126bc054aed4daf9e2ab772")
가 있는 users
데이터베이스의 creators
컬렉션에 있는 문서를 가리킵니다. 선택 사항 필드도 포함되어 있습니다.
참고
DBRef의 필드 순서는 중요하며 DBRef를 사용할 때는 위의 시퀀스를 사용해야 합니다.
DBRef용 드라이버 지원
드라이버 | DBRef 지원 | 참고 사항 |
---|---|---|
C | 지원되지 않음 | 참조를 수동으로 순회할 수 있습니다. |
C++ | 지원되지 않음 | 참조를 수동으로 순회할 수 있습니다. |
C# | 지원됨 | 자세한 내용은 C# 드라이버 페이지를 참조하세요. |
Go | 지원되지 않음 | 참조를 수동으로 순회할 수 있습니다. |
하스켈 | 지원되지 않음 | 참조를 수동으로 순회할 수 있습니다. |
Java | 지원됨 | 자세한 내용은 Java 드라이버 페이지를 참조하세요. |
Node.js | 지원됨 | 자세한 내용은 Node.js 드라이버 페이지를 참조하세요. |
Perl | 지원됨 | 자세한 내용은 펄(Perl) 드라이버 페이지를 참조하세요. |
PHP | 지원되지 않음 | 참조를 수동으로 순회할 수 있습니다. |
Python | 지원됨 | 자세한 내용은 PyMongo 드라이버 페이지를 참조하세요. |
Ruby | 지원됨 | 자세한 내용은 Ruby 드라이버 페이지를 참조하세요. |
Scala | 지원되지 않음 | 참조를 수동으로 순회할 수 있습니다. |
다음을 사용하세요.
대부분의 경우 두 개 이상의 관련 문서를 연결하려면 수동 참조 방법을 사용해야 합니다. 그러나 여러 컬렉션의 문서를 참고해야 하는 경우 DBRef를 사용하는 것이 좋습니다.