문서
MongoDB는 데이터 레코드를 BSON 문서로 저장합니다. BSON은 JSON 문서의 이진 표현이지만 JSON보다 더 많은 데이터 유형을 포함하고 있습니다. BSON 사양은 bsonspec.org를 참조하세요. BSON 유형도 참조하세요.
호환성
MongoDB는 기록을 다음 환경에서 호스팅되는 배포를 위한 문서로 저장합니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
문서 구조
MongoDB 문서는 필드-값 쌍으로 구성되며 다음과 같은 구조를 갖습니다.
{ field1: value1, field2: value2, field3: value3, ... fieldN: valueN }
필드의 값은 다른 문서, 배열 및 문서 배열을 포함한 모든 BSON 데이터 유형이 될 수 있습니다. 예를 들어 다음 문서에는 다양한 유형의 값이 포함되어 있습니다.
var mydoc = { _id: ObjectId("5099803df3f4948bd2f98391"), name: { first: "Alan", last: "Turing" }, birth: new Date('Jun 23, 1912'), death: new Date('Jun 07, 1954'), contribs: [ "Turing machine", "Turing test", "Turingery" ], views : NumberLong(1250000) }
위의 필드에는 다음과 같은 데이터 유형이 있습니다.
_id
ObjectIdname
first
및last
필드가 포함된 내장된 문서를 보유합니다.birth
날짜 유형의 값을death
보유합니다.contribs
문자열 배열views
NumberLong 유형의 값을 보유합니다.
필드 이름
필드 이름은 문자열입니다.
문서에는 다음과 같은 필드 이름 제한이 있습니다.
필드 이름
_id
는 프라이머리 키로 사용하기 위해 예약되어 있으며, 이 값은 컬렉션에서 고유해야 하고 변경할 수 없으며 배열이나 정규 표현식 이외의 모든 유형이 될 수 있습니다._id
가 하위 필드를 포함하는 경우, 하위 필드 이름은 ($
) 기호로 시작할 수 없습니다.
필드 이름에는
null
문자를 포함 할 수 없습니다.서버는 점(
.
)과 달러 기호($
)가 포함된 필드 이름의 저장을 허용합니다.MongoDB 5.0은 필드 이름에 (
$
) 및 (.
)를 사용에 대한 지원을 개선했습니다.몇 가지 제한 사항이 있습니다. 자세한 내용은 필드 이름 고려 사항을 참조하십시오.각 필드 이름은 문서 내에서 고유해야 합니다. 문서에 중복 필드가 있는 경우 MongoDB CRUD 작업이 예기치 않게 작동할 수 있으므로 중복 필드가 있는 문서를 저장해서는 안 됩니다.
MongoDB 쿼리 언어는 필드 이름이 중복된 문서를 지원하지 않습니다. 일부 BSON 빌더는 필드 이름이 중복된 BSON 문서 생성을 지원할 수 있지만, 삽입이 성공했거나 성공한 것처럼 보이더라도 이러한 문서를 MongoDB에 삽입하는 것은 지원되지 않습니다. 예를 들어, 필드 이름이 중복된 BSON 문서를 MongoDB 드라이버를 통해 삽입하면 드라이버가 삽입 전에 중복 값을 조용히 삭제하거나 중복 필드가 포함된 유효하지 않은 문서가 삽입되는 결과를 초래할 수 있습니다. 이러한 문서에 대해 쿼리를 수행하면 임의적이고 일관성 없는 결과가 나올 수 있습니다.
점 표기법
MongoDB는 점 표기법을 사용하여 배열의 요소에 액세스하고 내장된 문서의 필드에 액세스합니다.
배열
0부터 시작하는 인덱스 위치로 배열의 요소를 지정하거나 액세스하려면 배열 이름을 점(.
) 및 0부터 시작하는 인덱스 위치와 연결하고 따옴표로 묶으십시오.
"<array>.<index>"
예를 들어 문서에 다음과 같은 필드가 있다고 가정해 보겠습니다.
{ ... contribs: [ "Turing machine", "Turing test", "Turingery" ], ... }
contribs
배열의 세 번째 요소를 지정하려면 점 표기법 "contribs.2"
을 사용합니다.
배열을 쿼리하는 예시는 다음을 참조하세요.
팁
다음도 참조하세요.
$[]
업데이트 작업을 위한 모든 위치 연산자입니다,$[<identifier>]
업데이트 작업을 위한 필터링된 위치 연산자입니다,$
업데이트 작업을 위한 위치 연산자,$
배열 인덱스 위치를 알 수 없는 경우의 프로젝션 연산자배열을 쿼리하여 배열이 있는 점 표기법 예시를 확인합니다.
내장된 문서
점 표기법으로 내장된 문서의 필드를 지정하거나 액세스하려면 내장된 문서 이름과 점(.
) 및 필드 이름을 연결하고 따옴표로 묶습니다:
"<embedded document>.<field>"
예를 들어 문서에 다음과 같은 필드가 있다고 가정해 보겠습니다.
{ ... name: { first: "Alan", last: "Turing" }, contact: { phone: { type: "cell", number: "111-222-3333" } }, ... }
name
필드에last
로 명명된 필드를 지정하려면 점 표기법"name.last"
을 사용합니다.phone
문서의contact
필드에number
를 지정하려면 점 표기법"contact.phone.number"
를 사용하세요.
경고
파티션 필드에는 점(.
)이 포함된 필드 이름을 사용할 수 없습니다.
내장된 문서를 쿼리하는 예시는 다음을 참조하세요.
문서 제한
문서에는 다음과 같은 속성이 있습니다.
문서 크기 제한
최대 BSON 문서 크기는 16메가바이트입니다.
최대 문서 크기는 단일 문서가 과도한 양의 RAM을 사용하거나, 전송 중에 과도한 대역폭을 사용하지 않도록 하는 데 도움이 됩니다. 최대 크기보다 큰 문서를 저장하기 위해 MongoDB는 GridFS API를 제공합니다. GridFS에 대한 자세한 내용은 mongofiles
및 드라이버 설명서를 참조하십시오.
문서 필드 정렬
JavaScript 객체와 달리 BSON 문서의 필드는 정렬되어 있습니다.
쿼리 내 필드 순서
쿼리의 경우 필드 순서 동작은 다음과 같습니다.
문서를 비교할 때 필드 순서는 매우 중요합니다. 예를 들어 쿼리에서
a
및b
필드가 있는 문서를 비교할 경우:{a: 1, b: 1}
같음{a: 1, b: 1}
{a: 1, b: 1}
같지 않음{b: 1, a: 1}
효율적인 쿼리 실행을 위해 쿼리 엔진은 쿼리 처리 중에 필드를 다시 정렬할 수 있습니다. 또 다른 경우, 프로젝션 연산자인
$project
,$addFields
,$set
및$unset
를 처리할 때 필드 순서 변경이 발생할 수 있습니다.쿼리에서 반환된 최종 결과뿐만 아니라 중간 결과에서도 필드 재정렬이 발생할 수 있습니다.
일부 연산은 필드의 순서를 바꿀 수 있으므로 앞서 나열한 프로젝션 연산자를 사용하는 쿼리가 반환하는 결과에서 특정 필드 순서에 의존해서는 안 됩니다.
쓰기 작업의 필드 순서
쓰기 조작의 경우 MongoDB는 다음과 같은 경우를 제외하고 문서 필드의 순서를 유지합니다.
_id
필드는 항상 문서에서 첫 번째 필드입니다.renaming
개의 필드 이름이 포함된 업데이트는 문서에서 필드의 순서를 변경할 수 있습니다.
_id
필드
MongoDB에서 collection에 저장된 각 문서에는 기본 키 역할을 하는 고유한 _id 필드가 필요합니다. 삽입된 문서에서 _id
필드가 생략된 경우, MongoDB 드라이버는 _id
필드에 대한 ObjectId를 자동으로 생성합니다.
이는 upsert: true를 사용하여 업데이트 작업을 통해 삽입된 문서에도 적용됩니다.
_id
필드에는 다음과 같은 동작 및 제약 조건이 있습니다:
기본적으로 MongoDB는
_id
필드 생성 중에 고유 인덱스를 생성합니다._id
필드는 항상 문서에서 첫 번째 필드입니다. 서버가_id
필드가 없는 문서를 먼저 수신하면 서버는 필드를 앞으로 이동시킵니다._id
에 하위 필드가 포함된 경우 하위 필드 이름은 ($
) 기호로 시작할 수 없습니다._id
필드에는 배열, 정규식 또는 정의되지 않은 이외의 모든 BSON 데이터 유형의 값이 포함될 수 있습니다.경고
복제가 제대로 작동하도록 하려면 BSON 정규 표현식 유형의 값을
_id
필드에 저장하지 않습니다.
다음은 _id
의 값을 저장하는 일반적인 옵션입니다.
ObjectId를 사용합니다.
가능한 경우 자연 고유 식별자를 사용합니다. 이렇게 하면 공간이 절약되고 추가 인덱스가 필요하지 않습니다.
자동 증가 숫자를 생성합니다.
애플리케이션 코드에서 UUID를 생성합니다. collection 및
_id
인덱스에 UUID 값을 보다 효율적으로 저장하려면 UUID를 BSONBinData
유형의 값으로 저장합니다.BinData
유형의 인덱스 키는 다음과 같은 경우 인덱스에 더 효율적으로 저장됩니다.이진 하위 유형 값은 0~7 또는 128~135 범위 내에 있습니다.
바이트 배열의 길이는 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24 또는 32입니다.
드라이버의 BSON UUID 기능을 사용하여 UUID를 생성합니다. 드라이버 구현에서는 UUID 직렬화 및 역직렬화 로직을 다르게 구현할 수 있으며, 이는 다른 드라이버와 완전히 호환되지 않을 수 있습니다. UUID 상호 운용성에 관한 자세한 내용은 드라이버 설명서를 참조하세요.
참고
대부분의 MongoDB 드라이버 클라이언트는 _id
필드를 포함하고 MongoDB에 삽입 작업을 보내기 전에 ObjectId
를 생성합니다. 하지만 클라이언트가 _id
필드 없이 문서를 보내면 mongod
는 _id
필드를 추가하고 ObjectId
를 생성합니다.
문서 구조의 다른 용도
데이터 레코드를 정의하는 것 외에도 MongoDB는 쿼리 필터, 업데이트 사양 문서 및 인덱스 사양 문서를 포함하되 이에 국한되지 않는 전체 문서 구조를 사용합니다.
쿼리 필터 문서
쿼리 필터 문서는 읽기, 업데이트, 삭제 작업을 위해 어떤 기록을 선택할지 결정하는 조건을 지정합니다.
<field>:<value>
표현식을 사용하여 같음 조건과 쿼리 연산자 표현식을 지정할 수 있습니다.
{ <field1>: <value1>, <field2>: { <operator>: <value> }, ... }
예를 들면 다음과 같습니다.
업데이트 사양 문서
업데이트 사양 문서는 업데이트 연산자를 사용하여 업데이트 작업 중에 특정 필드에 대해 수행할 데이터 수정을 지정합니다.
{ <operator1>: { <field1>: <value1>, ... }, <operator2>: { <field2>: <value2>, ... }, ... }
예를 보려면 업데이트 사양을 참조하세요.
인덱스 사양 문서
인덱스 사양 문서는 인덱스할 필드와 인덱스 유형을 정의합니다.
{ <field1>: <type1>, <field2>: <type2>, ... }
추가 읽기
MongoDB 문서 모델에 대한 자세한 내용은 MongoDB 애플리케이션 현대화 가이드를 다운로드하여 알아보세요.
다음과 같은 리소스가 다운로드에 포함됩니다.
MongoDB를 사용한 데이터 모델링 방법론에 대한 프레젠테이션
RDBMS 데이터 모델에서 MongoDB로 마이그레이션하기 위한 모범 사례와 고려 사항을 다룬 백서
RDBMS에 해당하는 MongoDB 스키마 참조
애플리케이션 현대화 스코어카드