문서 작업 - Amazon DocumentDB

문서 작업

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

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

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

문서 추가

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

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

단일 문서 추가

모음에 단일 문서를 추가하려면 모음에 추가할 문서에 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") }

여러 문서 추가

모음에 여러 문서를 추가하려면 모음에 추가할 문서 목록에 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") ] }

문서 쿼리

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

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

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

컬렉션의 모든 문서 검색

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

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

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

피드 값과 일치하는 문서 검색

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

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

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

내장 문서와 일치하는 문서 검색

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

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

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

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

내장 문서의 필드 값과 일치하는 문서 검색

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

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

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

aArray와 일치하는 문서 검색

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

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

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

배열의 값과 일치하는 문서 검색

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

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

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

연산자를 사용하여 문서 검색

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

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

지원되는 쿼리 연산자 목록은 쿼리 및 프로젝션 연산자 섹션을 참조하십시오.

문서 업데이트

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

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

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

기존 필드의 값 업데이트

다음 업데이트 작업에 대해 추가한 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 } }

새 필드 추가

하나 이상의 새 필드를 추가하여 문서를 수정하려면 삽입할 문서 및 $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 }

내장 문서 교체

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

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

db.example.insert({ "DocName": "Document 1", "Date": { "Year": 1987, "Month": 4, "Day": 18 } })
내장 문서 교체

다음 예제에서는 현재 Date 문서를 새로운 문서로 교체합니다. 새 문서에는 MonthDay 필드만 있고, Year 필드는 제거되었습니다.

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

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

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

내장 문서에 새 필드 삽입

내장 문서에 필드를 추가하려면

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

다음과 같은 문서가 있을 때 다음 코드는 "점 표기법"을 사용하여 YearDoW 필드를 내장 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 }

문서에서 필드 제거

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

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

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

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

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

여러 문서에서 필드 제거

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

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

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

문서 삭제

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

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

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

db.example.remove( { } )