MongoDB는 데이터 레코드를 BSON 문서로 저장합니다. BSON은 추가적인 데이터 유형을 가진 JSON 문서의 이진 표현입니다. BSON 사양은 bsonspec.org를 참조하세요. BSON 유형도 참조하세요.
문서 구조
문서는 필드-값 쌍으로 구성되며 다음과 같은 구조를 가집니다.
{ 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 : Long(1250000) }
위의 필드에는 다음과 같은 데이터 유형이 있습니다.
_idObjectIdnamefirst및last필드가 포함된 내장된 문서를 보유합니다.birth날짜 유형의 값을death보유합니다.contribs문자열 배열viewsNumberLong 유형의 값을 보유합니다.
필드 이름
필드 이름은 특정 제약 조건과 요구 사항을 가진 문자열입니다.
일반 제한 사항
필드 이름에 대한 일반적인 제한 사항은 다음과 같습니다:
필드 이름에는
null문자를 포함 할 수 없습니다.서버는 점(
.)과 달러 기호($)가 포함된 필드 이름의 저장을 허용합니다.MongoDB 5.0은 필드 이름에 (
$) 및 (.)를 사용에 대한 지원을 개선했습니다.몇 가지 제한 사항이 있습니다. 자세한 내용은 필드 이름 고려 사항을 참조하십시오.
고유성 요구 사항
필드 이름은 다음과 같은 고유성 기준을 충족해야 합니다:
각 필드 이름은 문서 내에서 고유해야 합니다. 문서에 중복 필드가 있는 경우 MongoDB CRUD 작업이 예기치 않게 작동할 수 있으므로 중복 필드가 있는 문서를 저장해서는 안 됩니다.
MongoDB는 필드 이름이 중복된 문서 삽입을 지원하지 않습니다. 일부 BSON 빌더는 이러한 문서 생성을 지원할 수 있지만, MongoDB는 삽입이 성공했거나 성공한 것처럼 보여도 이를 지원하지 않습니다.
필드 이름이 중복된 문서의 업데이트는 업데이트 성공했거나 성공한 것처럼 보이더라도 지원되지 않습니다.
예시 를 들어, 필드 이름이 중복된 BSON 문서 MongoDB 운전자 통해 삽입하면 운전자 삽입 전에 중복 값을 조용히 삭제하거나 중복 필드가 포함된 유효하지 않은 문서 삽입될 수 있습니다. 이러한 문서를 쿼리하면 일관되지 않은 결과가 나타납니다.
MongoDB 부터 문서 6.1 중복된 필드 이름이 있는지 validate 확인하려면 full 필드 로 설정하다 상태에서 명령을 true 사용합니다. 모든 MongoDB 버전에서 $objectToArray 집계 연산자 사용하여 문서 중복된 필드 이름이 있는지 확인합니다.
참고
_id 필드와 관련된 제한 사항은 _id 필드를 참조하세요.
점 표기법
MongoDB는 배열 요소와 내장된 문서 필드에 접근할 때 점 표기법 을 사용합니다.
배열
배열 요소를 0부터 시작하는 인덱스 위치로 지정하거나 액세스하려면 배열 이름과 0부터 시작하는 인덱스 위치를 점 표기법으로 연결하고 결과를 따옴표로 묶으세요.
"<array>.<index>"
예를 들어 문서에 다음과 같은 필드가 있다고 가정해 보겠습니다.
{ ... contribs: [ "Turing machine", "Turing test", "Turingery" ], ... }
contribs 배열의 세 번째 요소를 지정하려면 "contribs.2" 사용하십시오.
배열을 쿼리하는 예시는 다음을 참조하세요.
팁
$[]업데이트 작업을 위한 모든 위치 연산자입니다,$[<identifier>]업데이트 작업을 위한 필터링된 위치 연산자입니다,$업데이트 작업을 위한 위치 연산자,$배열 인덱스 위치를 알 수 없는 경우의 프로젝션 연산자배열을 쿼리하여 배열이 있는 점 표기법 예시를 확인합니다.
내장된 문서
내장된 문서의 필드를 지정하거나 액세스하려면 점 표기법을 사용하여 내장된 문서 이름과 필드 이름을 연결하고 결과를 따옴표로 묶습니다.
"<embeddedDocument>.<field>"
예를 들어 문서에 다음과 같은 필드가 있다고 가정해 보겠습니다.
{ ... name: { first: "Alan", last: "Turing" }, contact: { phone: { type: "cell", number: "111-222-3333" } }, ... }
name에서last필드를 지정하려면"name.last"를 사용합니다.중첩된
phone문서에서number필드를 지정하려면"contact.phone.number"를 사용합니다.
경고
파티션 필드에는 점(.)이 포함된 필드 이름을 사용할 수 없습니다.
내장된 문서를 쿼리하는 예시는 다음을 참조하세요.
문서 제한
MongoDB 문서에는 쿼리 동작 및 애플리케이션 성능에 영향을 미칠 수 있는 문서 크기 및 필드 순서와 같은 특정 속성이 있습니다.
문서 크기 제한
최대 BSON 문서 크기는 16 메비바이트입니다.
최대 문서 크기는 단일 문서가 전송 중에 과도한 RAM이나 대역폭을 사용하지 않도록 보장하는 데 도움이 됩니다. 최대 크기보다 큰 문서를 저장하기 위해 MongoDB는 GridFS API를 제공합니다. GridFS에 대한 자세한 내용은 mongofiles 및 드라이버 설명서를 참조하세요.
문서 필드 정렬
BSON 문서의 필드는 (JavaScript 객체와 달리) 정렬됩니다.
쿼리 내 필드 순서
쿼리의 경우 필드 순서 동작은 다음과 같습니다.
필드 순서는 문서를 비교할 때 중요합니다. 예시는 다음과 같습니다.
{a: 1, b: 1}같음{a: 1, b: 1}{a: 1, b: 1}같지 않음{b: 1, a: 1}
쿼리 엔진은 효율적인 실행을 위해 필드를 재정렬할 수 있다. 필드 재정렬은 중간 및 최종 쿼리 결과에서 발생할 수 있으며 다음과 같은 프로젝션 연산자를 사용하여 발생할 수 있습니다.
중요
일부 작업은 필드를 다시 정렬할 수 있으므로 위의 프로젝션 연산자를 사용하는 쿼리의 결과에서 특정 필드 정렬에 의존하지 마세요.
쓰기 작업의 필드 순서
쓰기 조작의 경우 MongoDB는 다음과 같은 경우를 제외하고 문서 필드의 순서를 유지합니다.
_id필드는 항상 문서에서 첫 번째 필드입니다.renaming개의 필드 이름이 포함된 업데이트는 문서에서 필드의 순서를 변경할 수 있습니다.
필드 _id
MongoDB 에서 표준 컬렉션 에 저장된 각 문서 기본 키 역할을 하는 고유한 _id 필드 필요합니다. 삽입된 문서 _id 필드 생략된 경우, MongoDB 운전자 필드 _id 에 대한 ObjectId를 자동으로 생성합니다.
이는 upsert: true를 사용하여 업데이트 작업을 통해 삽입된 문서에도 적용됩니다.
참고
Time Series 컬렉션에서는 MongoDB 필드 에 인덱스 생성하지 않기 때문에 문서에 고유한 _id 필드 필요하지 _id 않습니다.
동작 및 제약 조건:
컬렉션을 생성할 때 MongoDB는 기본적으로
_id에 고유 인덱스를 생성합니다._id필드는 항상 문서에서 첫 번째 필드입니다. 서버가 문서에서_id필드가 첫 번째에 없다고 판단하면, 해당 필드를 문서의 맨 앞으로 이동시킵니다._id서브필드 이름은 ($) 기호로 시작할 수 없습니다._id필드에는 배열, 정규식 또는 정의되지 않은 것을 제외한 모든 BSON 데이터 유형 을 포함할 수 있습니다.
일반 _id 값 옵션:
다음은 _id 필드 값을 저장하기 위한 일반적인 옵션입니다.
ObjectId를 사용합니다.
가능한 경우 자연 고유 식별자를 사용합니다. 이렇게 하면 공간이 절약되고 추가 인덱스가 필요하지 않습니다.
자동 증가 숫자를 생성합니다.
UUID를 BSON
BinData유형으로 생성하여 컬렉션 및_id인덱스에 효율적인 저장합니다.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>, ... }