

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 문서 데이터베이스란?
<a name="what-is-document-db"></a>

일부 개발자는 정규화된 행과 열의 측면에서 데이터 모델을 생각하지 않습니다. 일반적으로, 애플리케이션 계층 내에서 데이터가 JSON 문서로서 나타나게 되는데, 그 이유는 개발자들이 자신의 데이터 모델을 문서로 생각하는 것이 보다 직관적이기 때문입니다.

애플리케이션 코드에서 사용하는 것과 동일한 문서 모델 형식을 이용함으로써 데이터베이스에서 데이터를 지속해서 사용할 수 있으므로 문서 데이터베이스의 대중성은 높아져 왔습니다. 문서 데이터베이스는 유연하고 신속한 개발을 위해 강력하고 직관적인 API를 제공합니다.

**Topics**
+ [사용 사례](document-database-use-cases.md)
+ [문서 이해](document-database-documents-understanding.md)
+ [문서 작업](document-database-working-with-documents.md)

# 문서 데이터베이스 사용 사례
<a name="document-database-use-cases"></a>

사용 사례는 문서 데이터베이스 또는 데이터를 관리하기 위한 일부 다른 유형의 데이터베이스가 필요한지 여부를 결정합니다. 문서 데이터베이스는 빠르고 반복적인 개발을 위해 유연한 스키마가 필요한 워크로드에 유용합니다. 다음은 문서 데이터베이스가 중요한 이점을 제공하는 일부 사용 사례의 예입니다.

**Topics**
+ [사용자 프로필](#document-databases-use-cases.user-profiles)
+ [실시간 빅 데이터](#document-databases-use-cases.big-data)
+ [콘텐츠 관리](#document-databases-use-cases.content-management)

## 사용자 프로필
<a name="document-databases-use-cases.user-profiles"></a>

문서 데이터베이스에는 유연한 스키마가 있으므로 속성과 데이터 값이 다른 문서를 저장할 수 있습니다. 문서 데이터베이스는 서로 다른 사용자가 다양한 유형의 정보를 제공하는 온라인 프로필에 대한 실용적인 솔루션입니다. 문서 데이터베이스에서는 각 사용자에 고유한 속성만 저장할 수 있어 각 사용자의 프로필을 효율적으로 저장할 수 있습니다.

사용자가 프로필에서 정보를 추가하거나 제거하도록 선택했다고 가정합니다. 이 경우 해당 문서를 최근에 추가된 속성과 데이터가 포함되거나 새로 생략된 속성과 데이터가 생략된 업데이트된 버전으로 쉽게 바꿀 수 있습니다. 문서 데이터베이스는 이 수준의 특성 및 유동성을 쉽게 관리합니다.

## 실시간 빅 데이터
<a name="document-databases-use-cases.big-data"></a>

과거에는 운영 데이터베이스와 분석 데이터베이스가 각각 운영 환경과 업무/보고 환경 등 서로 다른 환경에서 유지 관리되어 운영 데이터에서 정보를 추출하는 데 어려움이 있었습니다. 실시간으로 운영 정보를 추출할 수 있다는 것은 경쟁이 치열한 비즈니스 환경에서 중요합니다. 문서 데이터베이스를 사용하면 비즈니스에서는 모든 소스에서 운영 데이터를 저장하고 관리할 수 있으며 동시에 분석을 위해 데이터를 선택한 BI 엔진에 전달할 수 있습니다. 두 개의 환경이 필요하지 않습니다.

## 콘텐츠 관리
<a name="document-databases-use-cases.content-management"></a>

콘텐츠를 효과적으로 관리하려면 다양한 소스에서 콘텐츠를 수집 및 집계한 다음 고객에게 제공할 수 있어야 합니다. 문서 데이터베이스는 유연한 스키마로 인해 모든 유형의 데이터 수집과 저장에 적합합니다. 이 데이터베이스를 사용하여 이미지, 설명, 비디오 등 사용자 생성 콘텐츠를 비롯한 새 유형의 콘텐츠를 생성하고 통합할 수 있습니다.

# 문서 이해
<a name="document-database-documents-understanding"></a>

문서 데이터베이스는 관계형 데이터베이스에서처럼 각각 고유하고 고정된 구조를 가진 여러 테이블의 데이터를 정규화하는 대신 반정형 데이터를 문서로 저장하는 데 사용됩니다. 문서 데이터베이스에 저장된 문서는 중첩된 키-값 페어를 사용하여 문서의 구조 또는 스키마를 제공합니다. 그러나, 동일한 문서 데이터베이스에 다른 유형의 문서를 저장할 수 있으므로 다른 형식의 유사한 데이터를 처리하기 위한 요구 사항을 충족할 수 있습니다. 예를 들어, 각 문서는 자체적으로 설명되므로 [문서 데이터베이스의 예제 문서](#document-database-documents) 주제에 설명된 온라인 상점을 위한 JSON 인코딩 문서를 동일한 문서 데이터베이스에 저장할 수 있습니다.

**Topics**
+ [SQL 대 비관계형 용어](#document-database-sql-vs-nosql-terms)
+ [단순 문서](#document-database-documents-simple)
+ [내장 문서](#document-database-documents-embeded)
+ [문서 데이터베이스의 예제 문서](#document-database-documents)
+ [문서 데이터베이스에서 정규화 이해](#document-database-normalization)

## SQL 대 비관계형 용어
<a name="document-database-sql-vs-nosql-terms"></a>

다음 표에서는 문서 데이터베이스(MongoDB)에서 사용하는 용어를 SQL 데이터베이스에서 사용하는 용어와 비교합니다.


|  SQL  |  MongoDB  | 
| --- | --- | 
|  표  |  수집  | 
|  열  |  문서  | 
|  열  |  Field  | 
|  프라이머리 키  |  ObjectId  | 
|  인덱스  |  인덱스  | 
|  보기  |  보기  | 
|  중첩된 테이블 또는 객체  |  포함 문서  | 
|  배열  |  배열  | 

## 단순 문서
<a name="document-database-documents-simple"></a>

문서 데이터베이스의 모든 문서는 자체적으로 설명되어 있습니다. 이 설명서에서는 다른 인코딩 수단을 사용할 수 있는 경우에도 JSON과 유사한 형식의 문서를 사용합니다.

단순 문서에는 문서 내에서 모두 동일한 수준인 하나 이상의 필드가 있습니다. 다음 예에서 `SSN`, `LName`, `FName`, `DOB`, `Street`, `City`, `State-Province`, `PostalCode` 및 `Country` 필드는 문서 내에서 모두 형제 요소입니다.

```
{
   "SSN": "123-45-6789",
   "LName": "Rivera",
   "FName": "Martha",
   "DOB": "1992-11-16",
   "Street": "125 Main St.",
   "City": "Anytown",
   "State-Province": "WA",
   "PostalCode": "98117",
   "Country": "USA"
}
```

단순 문서에서 정보를 구성할 때 각 필드는 개별적으로 관리됩니다. 개인의 주소를 가져오려면 `Street`, `City`, `State-Province`, `PostalCode` 및 `Country`를 개별 데이터 항목으로 가져와야 합니다.

## 내장 문서
<a name="document-database-documents-embeded"></a>

복잡한 문서는 문서 내에 내장 문서를 생성하여 데이터를 구성합니다. 내장 문서는 데이터 그룹화 및 개별 데이터 항목 중 제공된 사례에서 더 효율적인 방식으로 관리하는 데 도움이 됩니다. 이전 예제를 사용하면 기본 문서에 `Address` 문서를 포함할 수 있습니다. 이렇게 하면 다음과 같은 문서 구조가 발생합니다.

```
{
   "SSN": "123-45-6789",
   "LName": "Rivera",
   "FName": "Martha",
   "DOB": "1992-11-16",
   "Address": 
   {
       "Street": "125 Main St.",
       "City": "Anytown",
       "State-Province": "WA",
       "PostalCode": "98117",
       "Country": "USA" 
   }
}
```

이제 개별 필드(`"SSN":`), 내장 문서(`"Address":`) 또는 내장 문서의 멤버(`"Address":{"Street":}`)로 문서의 데이터에 액세스할 수 있습니다.

## 문서 데이터베이스의 예제 문서
<a name="document-database-documents"></a>

이전에 설명한 대로 문서 데이터베이스의 각 문서는 자체적으로 설명되므로 문서 데이터베이스 내의 문서 구조는 서로 다를 수 있습니다. 다음의 두 문서(책 및 정기 간행물용)는 구조적으로 서로 다릅니다. 하지만 두 문서 모두 동일한 문서 데이터베이스에 있을 수 있습니다.

다음은 샘플 책 문서입니다.

```
{
    "_id" : "9876543210123",
    "Type": "book",
    "ISBN": "987-6-543-21012-3",
    "Author": 
    {
        "LName":"Roe",
        "MI": "T",
        "FName": "Richard" 
    },
    "Title": "Understanding Document Databases"
}
```

다음은 두 개의 기사가 있는 샘플 정기 간행물 문서입니다.

```
{
    "_id" : "0123456789012",
    "Publication": "Programming Today",
    "Issue": 
    {
        "Volume": "14",
        "Number": "09"
    },
    "Articles" : [ 
        {
            "Title": "Is a Document Database Your Best Solution?",
            "Author": 
            {
                "LName": "Major",
                "FName": "Mary" 
            }
        },
        {
            "Title": "Databases for Online Solutions",
            "Author": 
            {
                "LName": "Stiles",
                "FName": "John" 
            }
        }
    ],
    "Type": "periodical"
}
```

이 두 문서의 구조를 비교합니다. 관계형 데이터베이스에서는 별도의 "정기 간행물" 및 "책" 테이블이나 "출판", "발행", "기사", "MI" 등 사용하지 않은 필드가 `null` 값인 단일 테이블이 필요합니다. 문서 데이터베이스는 각 문서가 자체 구조를 정의하는 반구조화이므로 이러한 두 문서는 `null` 필드가 없는 동일한 문서 데이터베이스에서 동시에 존재할 수 있습니다. 문서 데이터베이스는 희소 데이터를 처리하는 데 적합합니다.

문서 데이터베이스를 대상으로 개발하면 빠르고 반복적으로 개발할 수 있습니다. 이는 전체 모음에 대한 스키마를 변경하지 않고 문서의 데이터 구조를 동적으로 변경할 수 있기 때문입니다. 문서 데이터베이스는 신속한 개발 및 동적으로 변화하는 환경에 매우 적합합니다.

## 문서 데이터베이스에서 정규화 이해
<a name="document-database-normalization"></a>

문서 데이터베이스는 정규화되지 않습니다. 한 문서에서 발견된 데이터가 다른 문서에서 반복될 수 있습니다. 게다가 문서 간에 일부 데이터 차이가 있을 수 있습니다. 예를 들어, 온라인 상점에서 구매하고 구매에 대한 모든 세부 정보가 단일 문서에 저장되는 시나리오를 고려하십시오. 문서는 다음 JSON 문서와 같을 수 있습니다.

```
{
    "DateTime": "2018-08-15T12:13:10Z",
    "LName" : "Santos",
    "FName" : "Paul",
    "Cart" : [ 
        {
            "ItemId" : "9876543210123",
            "Description" : "Understanding Document Databases",
            "Price" : "29.95"
        },
        {
            "ItemId" : "0123456789012",
            "Description" : "Programming Today",
            "Issue": {
                "Volume": "14",
                "Number": "09"
            },
            "Price" : "8.95"
        },
        {
            "ItemId": "234567890-K",
            "Description": "Gel Pen (black)",
            "Price": "2.49" 
        }
    ],
    "PaymentMethod" : 
    {
        "Issuer" : "MasterCard",
        "Number" : "1234-5678-9012-3456" 
    },
    "ShopperId" : "1234567890" 
}
```

이러한 모든 정보는 거래 모음에서 문서로 저장됩니다. 나중에 품목 하나를 구매하지 않은 것을 알게 되었습니다. 따라서 다시 동일한 상점에 로그인하여 다시 구매했습니다. 이러한 구매도 거래 모음에서 다른 문서로 저장됩니다.

```
{
    "DateTime": "2018-08-15T14:49:00Z",
    "LName" : "Santos",
    "FName" : "Paul",
    "Cart" : [ 
        {
            "ItemId" : "2109876543210",
            "Description" : "Document Databases for Fun and Profit",
            "Price" : "45.95"
        } 
    ],
    "PaymentMethod" : 
    {
        "Issuer" : "Visa",
        "Number" : "0987-6543-2109-8765" 
    },
    "ShopperId" : "1234567890" 
}
```

이 두 문서, 즉 이름과 구매자 ID(같은 신용카드를 사용한 경우에는 신용카드 정보)가 중복된다는 점에 주목하세요. 그러나 스토리지가 저렴하고, 각 문서가 조인할 필요가 없는 단순 키-값 쿼리를 사용하여 빠르게 검색할 수 있는 단일 거래를 완전히 기록하기 때문에 괜찮습니다.

또한 신용 카드 정보라는 두 문서 간에도 명백한 차이가 있습니다. 각각의 구매에 대해 다른 신용카드를 사용한 것 같으므로 이러한 분명한 차이는 유일합니다. 각 문서는 문서화된 거래에 대해 정확합니다.

# 문서 작업
<a name="document-database-working-with-documents"></a>

문서 데이터베이스로서 Amazon DocumentDB는 JSON 데이터를 쉽게 저장, 쿼리 및 인덱싱할 수 있습니다. Amazon DocumentDB에서 컬렉션은 모든 문서에 적용되는 단일 스키마가 없다는 점을 제외하면 관계형 데이터베이스의 테이블과 유사합니다. 모음을 통해 유사한 문서를 그룹화하여 모두 동일한 데이터베이스에 유지할 수 있으며, 구조가 동일하지 않아도 됩니다.

이전 단원의 예제 문서를 사용할 경우 `reading_material` 및 `office_supplies`에 대한 모음이 있을 수 있습니다. 소프트웨어에서는 문서가 속할 모음을 결정합니다.

다음 예제에서는 MongoDB API를 사용하여 문서를 추가, 쿼리, 업데이트 및 삭제하는 방법을 보여줍니다.

**Topics**
+ [문서 추가](#document-database-adding-documents)
+ [문서 쿼리](#document-database-queries)
+ [문서 업데이트](#document-database-updating)
+ [문서 삭제](#document-database-deleting)

## 문서 추가
<a name="document-database-adding-documents"></a>

Amazon DocumentDB에서는 컬렉션에 문서를 처음 추가할 때 데이터베이스가 생성됩니다. 이 예제에서는 클러스터에 연결할 때 기본 데이터베이스인 `test` 데이터베이스에 `example`이라는 컬렉션을 만듭니다. 첫 번째 문서가 삽입될 때 컬렉션이 암시적으로 만들어지기 때문에 컬렉션 이름에 대한 오류 검사가 수행되지 않습니다. 따라서 컬렉션 이름에 오타(예: `example` 대신 `eexample`)가 생성되고 의도한 컬렉션이 아닌 `eexample` 컬렉션에 문서가 추가됩니다. 오류 확인은 애플리케이션을 통해 처리되어야 합니다.

다음 예제에서는 MongoDB API를 사용하여 문서를 추가합니다.

**Topics**
+ [단일 문서 추가](#document-database-adding-documents-single)
+ [여러 문서 추가](#document-database-adding-documents-multiple)

### 단일 문서 추가
<a name="document-database-adding-documents-single"></a>

모음에 단일 문서를 추가하려면 모음에 추가할 문서에 `insertOne( {} )` 작업을 사용합니다.

```
db.example.insertOne(
    {
        "Item": "Ruler",
        "Colors": ["Red","Green","Blue","Clear","Yellow"],
        "Inventory": {
            "OnHand": 47,
            "MinOnHand": 40
        },
        "UnitPrice": 0.89
    }
)
```

이 작업의 출력은 다음과 같습니다(JSON 형식).

```
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5bedafbcf65ff161707de24f")
}
```

### 여러 문서 추가
<a name="document-database-adding-documents-multiple"></a>

모음에 여러 문서를 추가하려면 모음에 추가할 문서 목록에 `insertMany( [{},...,{}] )` 작업을 사용합니다. 이 특정 목록의 문서에 다른 스키마가 있는 경우에도 모두 동일한 모음에 추가할 수 있습니다.

```
db.example.insertMany(
    [
        {
            "Item": "Pen",
            "Colors": ["Red","Green","Blue","Black"],
            "Inventory": {
                "OnHand": 244,
                "MinOnHand": 72 
            }
        },
        {
            "Item": "Poster Paint",
            "Colors": ["Red","Green","Blue","Black","White"],
            "Inventory": {
                "OnHand": 47,
                "MinOnHand": 50 
            }
        },
        {
            "Item": "Spray Paint",
            "Colors": ["Black","Red","Green","Blue"],
            "Inventory": {
                "OnHand": 47,
                "MinOnHand": 50,
                "OrderQnty": 36
            }
        }    
    ]
)
```

이 작업의 출력은 다음과 같습니다(JSON 형식).

```
{
    "acknowledged" : true,
    "insertedIds" : [
            ObjectId("5bedb07941ca8d9198f5934c"),
            ObjectId("5bedb07941ca8d9198f5934d"),
            ObjectId("5bedb07941ca8d9198f5934e")
    ]
}
```

## 문서 쿼리
<a name="document-database-queries"></a>

이따금 판매하는 물품을 고객이 보고 구매할 수 있도록 온라인 상점의 재고를 조회해야 할 수도 있습니다. 컬렉션을 쿼리하는 것은 컬렉션의 모든 문서에 대한 것이든 특정 기준을 충족하는 문서에만 대한 것이든 관계없이 상대적으로 간단합니다.

문서를 쿼리하려면 `find()` 작업을 사용합니다. `find()` 명령에는 반환할 문서 선택 시 사용할 기준을 정의하는 단일 문서 파라미터가 있습니다. `find()`의 출력은 줄 바꿈이 없이 한 줄로 된 텍스트 형식의 문서입니다. 쉽게 읽기 위해 출력 문서의 형식을 지정하려면 `find().pretty()`를 사용하십시오. 이 주제의 모든 예제는 `.pretty()`를 사용하여 출력 형식을 지정합니다.

앞선 두 가지 연습 `insertOne()` 및 `insertMany()`에서 `example` 컬렉션에 삽입한 4개의 문서를 사용합니다.

**Topics**
+ [컬렉션의 모든 문서 검색](#document-database-queries-all-documents)
+ [피드 값과 일치하는 문서 검색](#document-database-queries-match-criteria)
+ [내장 문서와 일치하는 문서 검색](#document-database-queries-entire-embedded-document)
+ [내장 문서의 필드 값과 일치하는 문서 검색](#document-database-queries-embeded-document-field)
+ [배열이 일치하는 문서 검색](#document-database-queries-array-match)
+ [배열의 값과 일치하는 문서 검색](#document-database-queries-array-value-match)
+ [연산자를 사용하여 문서 검색](#document-database-query-operators)

### 컬렉션의 모든 문서 검색
<a name="document-database-queries-all-documents"></a>

모음의 모든 문서를 검색하려면 빈 쿼리 문서로 `find()` 작업을 사용하십시오.

다음 쿼리는 `example` 모음의 모든 문서를 반환합니다.

```
db.example.find( {} ).pretty()
```

### 피드 값과 일치하는 문서 검색
<a name="document-database-queries-match-criteria"></a>

필드 및 값과 일치하는 모든 문서를 검색하려면 일치하는 필드 및 값을 식별하는 쿼리 문서로 `find()` 작업을 사용합니다.

이전 문서를 사용하면 이 쿼리는 "Item" 필드가 "Pen"과 동일한 모든 문서를 반환합니다.

```
db.example.find( { "Item": "Pen" } ).pretty()
```

### 내장 문서와 일치하는 문서 검색
<a name="document-database-queries-entire-embedded-document"></a>

내장 문서와 일치하는 모든 문서를 찾으려면 내장 문서 이름과 내장 문서의 모든 필드 및 값을 지정하는 쿼리 문서와 함께 `find()` 작업을 사용합니다.

내장 문서를 일치시킬 때 문서의 내장 문서는 쿼리에 있는 것과 동일한 이름을 가져야 합니다. 또한, 내장 문서의 필드 및 값은 쿼리와 일치해야 합니다.

다음 쿼리는 "Poster Paint" 문서만 반환합니다. "Pen"에는 "`OnHand`" 및 "`MinOnHand`"에 대한 다른 값이 있으며, "Spray Paint"에는 쿼리 문서보다 필드 하나(`OrderQnty`)가 더 있기 때문입니다.

```
db.example.find({"Inventory": {
    "OnHand": 47,
    "MinOnHand": 50 } } ).pretty()
```

### 내장 문서의 필드 값과 일치하는 문서 검색
<a name="document-database-queries-embeded-document-field"></a>

내장 문서와 일치하는 모든 문서를 찾으려면 내장 문서 이름과 내장 문서의 모든 필드 및 값을 지정하는 쿼리 문서와 함께 `find()` 작업을 사용합니다.

이전 문서에서 다음 쿼리는 "점 표기법"을 사용하여 내장 문서와 관심 있는 필드를 지정합니다. 다른 필드가 내장 문서에 표시될 수 있는지 여부와 무관하게 이와 일치하는 모든 문서가 반환됩니다. "Poster Paint" 및 "Spray Paint"가 지정된 필드 및 값과 일치하므로 쿼리가 "Poster Paint" 및 "Spray Paint"를 반환합니다.

```
db.example.find({"Inventory.OnHand": 47, "Inventory.MinOnHand": 50 }).pretty()
```

### 배열이 일치하는 문서 검색
<a name="document-database-queries-array-match"></a>

배열이 일치하는 모든 문서를 찾으려면 관심 있는 배열 이름과 해당 배열의 모든 값을 포함하여 `find()` 작업을 사용합니다. 쿼리가 배열 값이 동일하면서 쿼리와 동일한 순서인 해당 이름을 가진 배열을 포함한 모든 문서를 반환합니다.

"Poster Paint"에는 추가 색상(White)이 있고 "Spray Paint"에는 색상이 다른 순서로 있으므로 다음 쿼리는 "Pen"만을 반환합니다.

```
db.example.find( { "Colors": ["Red","Green","Blue","Black"] } ).pretty() 
```

### 배열의 값과 일치하는 문서 검색
<a name="document-database-queries-array-value-match"></a>

특정 배열 값을 보유한 모든 문서를 찾으려면 관심 있는 배열 이름과 값을 포함하여 `find()` 작업을 사용합니다.

```
db.example.find( { "Colors": "Red" } ).pretty() 
```

각각 `Colors`라는 배열과 배열 내에 "`Red`" 값이 있으므로 이전 작업은 세 문서 모두를 반환합니다. "`White`" 값을 지정한 경우 쿼리는 "Poster Paint"만 반환합니다.

### 연산자를 사용하여 문서 검색
<a name="document-database-query-operators"></a>

다음 쿼리는 "`Inventory.OnHand`" 값이 50 미만인 모든 문서를 반환합니다.

```
db.example.find(
        { "Inventory.OnHand": { $lt: 50 } } )
```

지원되는 쿼리 연산자 목록은 [쿼리 및 프로젝션 연산자](mongo-apis.md#mongo-apis-query) 섹션을 참조하십시오.

## 문서 업데이트
<a name="document-database-updating"></a>

일반적으로 문서는 정적이 아니며 애플리케이션 워크플로의 일부로 업데이트됩니다. 다음은 문서를 업데이트할 수 있는 몇 가지 방법을 보여주는 예입니다.

기존 문서를 업데이트하려면 `update()` 작업을 사용합니다. `update()` 작업에는 두 개의 문서 파라미터가 있습니다. 첫 번째 문서는 업데이트할 문서를 식별합니다. 두 번째 문서는 업데이트를 지정합니다.

기존 필드를 업데이트할 때 (해당 필드가 단순 필드이든, 배열이든, 포함된 문서이든) 필드 이름과 해당 값을 지정합니다. 작업 종료 시 이전 문서의 필드가 새 필드와 값으로 교체된 것과 같습니다.

**Topics**
+ [기존 필드의 값 업데이트](#document-database-updating-existing-fields)
+ [새 필드 추가](#document-database-updating-adding-field)
+ [내장 문서 교체](#document-database-replacing-embedded-document)
+ [내장 문서에 새 필드 삽입](#document-database-updating-adding-field-embedded)
+ [문서에서 필드 제거](#document-database-remove-field)
+ [여러 문서에서 필드 제거](#document-database-remove-field-all)

### 기존 필드의 값 업데이트
<a name="document-database-updating-existing-fields"></a>

다음 업데이트 작업에 대해 추가한 4개의 문서를 사용합니다.

```
{
    "Item": "Ruler",
    "Colors": ["Red","Green","Blue","Clear","Yellow"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 40
    },
    "UnitPrice": 0.89
},
{
    "Item": "Pen",
    "Colors": ["Red","Green","Blue","Black"],
    "Inventory": {
        "OnHand": 244,
        "MinOnHand": 72 
    }
},
{
    "Item": "Poster Paint",
    "Colors": ["Red","Green","Blue","Black","White"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 50 
    }
},
{
    "Item": "Spray Paint",
    "Colors": ["Black","Red","Green","Blue"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 50,
        "OrderQnty": 36
    }
}
```

**단순 필드 업데이트**  
단순 필드를 업데이트하려면 `$set`와 함께 `update()`를 사용하여 필드 이름과 새 값을 지정합니다. 다음 예제에서는 `Item`을 "Pen"에서 "Gel Pen"으로 바꿉니다.

```
db.example.update(
    { "Item" : "Pen" },
    { $set: { "Item": "Gel Pen" } }
)
```

이 작업의 결과는 다음과 같습니다.

```
{
    "Item": "Gel Pen",
    "Colors": ["Red","Green","Blue","Black"],
    "Inventory": {
        "OnHand": 244,
        "MinOnHand": 72 
    }
}
```

**배열 업데이트**  
다음 예제에서는 색상 목록에서 `Orange`를 포함하고 `White`를 제외한 새 배열로 기존 배열을 교체합니다. 새 색상 목록은 `update()` 작업에서 지정된 순서입니다.

```
db.example.update(
    { "Item" : "Poster Paint" },
    { $set: { "Colors": ["Red","Green","Blue","Orange","Black"] } }
)
```

이 작업의 결과는 다음과 같습니다.

```
{
    "Item": "Poster Paint",
    "Colors": ["Red","Green","Blue","Orange","Black"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 50 
    }
}
```

### 새 필드 추가
<a name="document-database-updating-adding-field"></a>

하나 이상의 새 필드를 추가하여 문서를 수정하려면 삽입할 문서 및 `$set` 연산자를 사용하여 삽입할 새 필드와 값을 식별하는 쿼리 문서에 `update()` 작업을 사용합니다.

다음 예제에서는 Spray Paint 문서에 `UnitPrice` 필드와 `3.99` 값을 추가합니다. `3.99`라는 값은 숫자이지 문자열이 아닙니다.

```
db.example.update(
    { "Item": "Spray Paint" },
    { $set: { "UnitPrice": 3.99 } } 
)
```

이 작업의 결과는 다음과 같습니다(JSON 형식).

```
{
    "Item": "Spray Paint",
    "Colors": ["Black","Red","Green","Blue"],
    "Inventory": {
        "OnHand": 47,
        "MinOnHand": 50,
        "OrderQnty": 36
    },
    "UnitPrice": 3.99
}
```

### 내장 문서 교체
<a name="document-database-replacing-embedded-document"></a>

내장 문서를 교체함으로써 문서를 수정하려면 내장 문서 및 `$set` 연산자를 사용한 새 필드와 값을 식별하는 문서에 `update()` 작업을 사용합니다.

다음과 같은 문서가 있다고 가정합니다.

```
db.example.insert({
    "DocName": "Document 1",
    "Date": {
        "Year": 1987,
        "Month": 4,
        "Day": 18
    }
})
```

**내장 문서 교체**  
다음 예제에서는 현재 Date 문서를 새로운 문서로 교체합니다. 새 문서에는 `Month` 및 `Day` 필드만 있고, `Year` 필드는 제거되었습니다.

```
db.example.update(
    { "DocName" : "Document 1" },
    { $set: { "Date": { "Month": 4, "Day": 18 } } }
)
```

이 작업의 결과는 다음과 같습니다.

```
{
    "DocName": "Document 1",
    "Date": {
        "Month": 4,
        "Day": 18
    }
}
```

### 내장 문서에 새 필드 삽입
<a name="document-database-updating-adding-field-embedded"></a>

**내장 문서에 필드를 추가하려면**  
내장 문서에 하나 이상의 새 필드를 추가하여 문서를 수정하려면 내장 문서와 내장 문서 지정을 위한 "점 표기법" 및 `$set` 연산자를 사용하여 삽입할 새 필드와 값을 식별하는 문서에 `update()` 작업을 사용합니다.

다음과 같은 문서가 있을 때 다음 코드는 "점 표기법"을 사용하여 `Year` 및 `DoW` 필드를 내장 `Date` 문서에 삽입하고, `Words`를 상위 문서에 삽입합니다.

```
{
    "DocName": "Document 1",
    "Date": {
        "Month": 4,
        "Day": 18
    }
}
```

```
db.example.update(
    { "DocName" : "Document 1" },
    { $set: { "Date.Year": 1987, 
              "Date.DoW": "Saturday",
              "Words": 2482 } }
)
```

이 작업의 결과는 다음과 같습니다.

```
{
    "DocName": "Document 1",
    "Date": {
        "Month": 4,
        "Day": 18,
        "Year": 1987,
        "DoW": "Saturday"
    },
    "Words": 2482
}
```

### 문서에서 필드 제거
<a name="document-database-remove-field"></a>

문서에서 필드를 제거하여 문서를 수정하려면 쿼리 문서에 필드를 제거할 문서를 식별하는 `update()` 작업을 사용하고, 제거할 필드를 지정하는 `$unset` 연산자를 사용합니다.

다음 예제에서는 이전 문서에서 `Words` 필드를 제거합니다.

```
db.example.update(
    { "DocName" : "Document 1" },
    { $unset: { Words:1 } }
)
```

이 작업의 결과는 다음과 같습니다.

```
{
    "DocName": "Document 1",
    "Date": {
        "Month": 4,
        "Day": 18,
        "Year": 1987,
        "DoW": "Saturday"
    }
}
```

### 여러 문서에서 필드 제거
<a name="document-database-remove-field-all"></a>

여러 문서에서 필드를 제거하여 문서를 수정하려면 `$unset` 연산자와 `multi` 옵션 세트를 `true`로 설정하여 `update()` 작업을 사용합니다.

다음 예제에서는 예제 컬렉션의 모든 문서에서 `Inventory` 필드를 제거합니다. 문서에 `Inventory` 필드가 없으면 해당 문서에 어떤 작업도 수행되지 않습니다. `multi: true`가 생략되면 기준을 충족하는 첫 번째 문서에만 작업이 수행됩니다.

```
db.example.update(
    {},
    { $unset: { Inventory:1 } },
    { multi: true }
)
```

## 문서 삭제
<a name="document-database-deleting"></a>

데이터베이스에서 문서를 제거하려면 `remove()` 작업을 사용하여 제거할 문서를 지정합니다. 다음 코드는 `example` 모음에서 "Gel Pen"을 제거합니다.

```
db.example.remove( { "Item": "Gel Pen" } )
```

데이터베이스에서 모든 문서를 제거하려면 `remove()` 작업과 빈 쿼리를 사용합니다.

```
db.example.remove( { } )
```