MongoDB 쿼리 - 웹 SDK
이 페이지의 내용
- 전제 조건
- 프로젝트 설정
- 프로젝트 설정
- Mongo DB Atlas 서비스 클러스터 연결하기
- Realm 종속성 가져오기
- MongoDB 컬렉션 핸들 인스턴스화하기
- 데이터 예시
- 문서 만들기
- 단일 문서 삽입
- 여러 문서를 삽입합니다.
- 문서 읽기
- 단일 문서 찾기
- 여러 문서 찾기
- collection의 문서 수 계산
- 문서 업데이트
- 단일 문서 업데이트
- 여러 문서 업데이트하기
- 문서 업서트
- 문서 삭제
- 단일 문서 삭제
- 여러 문서 삭제
- 변화를 주시하세요
- 컬렉션의 모든 변경 사항 보기
- 필터로 컬렉션의 변경 사항 보기
- 문서 애그리게이션
- collection의 문서 애그리게이션
- 집계 단계
- 문서 필터링
- 문서 그룹화
- 페이지 매김 문서
- 문서 필드 프로젝트
- 문서에 필드 추가
- 배열 값 풀기
쿼리 API 가 MongoDB Atlas Realm Web SDK 포함된 의MongoDB 클라이언트 를 사용하여 클라이언트 애플리케이션 코드에서 직접 에 저장된 데이터를 쿼리 할 수 있습니다. Atlas App Services 는 로그인한 사용자 또는 각 문서 의 콘텐츠를 기반으로 결과를 안전하게 조회 할 수 있도록 컬렉션에 대한 데이터 액세스 규칙 을 제공합니다.
다음 작업을 통해 Realm 웹 SDK를 사용하여 웹 앱에서 연결된 MongoDB Atlas 클러스터를 쿼리할 수 있습니다.
참고
이 페이지에 설명된 각 작업은 쿼리 를 사용하여 작업이 실행되는 컬렉션의 특정 문서를 일치시킵니다. 필터가 컬렉션의 여러 문서와 일치하면 정렬 매개 변수를 지정하지 않는 한 확정되지 않은 순서 로 반환됩니다. 즉, findOne()
, updateOne()
또는 deleteOne()
함수에 대해 정렬을 지정하지 않으면 쿼리와 일치하는 모든 문서와 작업이 일치할 수 있습니다. 정렬에 대한 자세한 내용은 cursor.sort()를 참조하세요.
전제 조건
MongoDB 웹 애플리케이션에서 MongoDB 를 쿼리하려면 먼저 에서 데이터 액세스를 설정해야 App Services App 합니다. Realm SDK가 Atlas 를 쿼리할 수 있도록 백엔드 앱을 설정하는 방법을 알아보려면 Atlas 앱 서비스 문서에서 MongoDB 데이터 액세스 설정 을 참조하세요.
프로젝트 설정
프로젝트 설정
웹용 Realm 설치 가이드의 단계를 따르십시오.
Mongo DB Atlas 서비스 클러스터 연결하기
데이터 소스 연결 가이드의 단계를 따르세요. 서비스에 의미 있는 이름을 지정합니다. Realm SDK를 사용하여 클러스터에 연결하는 데 필요합니다.
데이터 예시
이 페이지의 예시에서는 식물 매장 체인에서 판매되는 다양한 식물을 설명하는 다음 MongoDB 컬렉션을 사용합니다.
{ _id: ObjectId("5f87976b7b800b285345a8b4"), name: "venus flytrap", sunlight: "full", color: "white", type: "perennial", _partition: "Store 42", }, { _id: ObjectId("5f87976b7b800b285345a8b5"), name: "sweet basil", sunlight: "partial", color: "green", type: "annual", _partition: "Store 42", }, { _id: ObjectId("5f87976b7b800b285345a8b6"), name: "thai basil", sunlight: "partial", color: "green", type: "perennial", _partition: "Store 42", }, { _id: ObjectId("5f87976b7b800b285345a8b7"), name: "helianthus", sunlight: "full", color: "yellow", type: "annual", _partition: "Store 42", }, { _id: ObjectId("5f87976b7b800b285345a8b8"), name: "petunia", sunlight: "full", color: "purple", type: "annual", _partition: "Store 47", },
문서 만들기
이 코드 스니펫은 웹 앱 에서 하나 이상의 문서를 MongoDB 컬렉션 에 삽입하는 방법을 보여줍니다. 삽입 작업은 MongoDB 에 추가할 문서 를 인수로 받고 Promise 을(를) 반환합니다. 작업 실행 결과를 포함하는 객체 로 확인됩니다.
단일 문서 삽입
collection.insertOne()을 호출하여 하나의 문서를 삽입할 수 있습니다.
다음 스니펫 은 매장 그룹의 판매 대상 식물을 설명하는 문서 모음에 '은방울꽃' 식물을 설명하는 단일 문서를 삽입합니다.
const result = await plants.insertOne({ name: "lily of the valley", sunlight: "full", color: "white", type: "perennial", _partition: "Store 47", }); console.log(result);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
{ insertedId: ObjectId("5f879f83fc9013565c23360e") }
여러 문서를 삽입합니다.
collection.insertMany()를 사용하여 여러 문서를 동시에 삽입할 수 있습니다.
다음 스니펫 은 매장 그룹에서 판매할 식물을 설명하는 문서 모음에 식물을 설명하는 문서 3개를 삽입합니다.
const result = await plants.insertMany([ { name: "rhubarb", sunlight: "full", color: "red", type: "perennial", _partition: "Store 47", }, { name: "wisteria lilac", sunlight: "partial", color: "purple", type: "perennial", _partition: "Store 42", }, { name: "daffodil", sunlight: "full", color: "yellow", type: "perennial", _partition: "Store 42", }, ]); console.log(result);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
{ insertedIds: [ ObjectId("5f87a0defc9013565c233611"), ObjectId("5f87a0defc9013565c233612"), ObjectId("5f87a0defc9013565c233613"), ], }
문서 읽기
이 코드 스니펫은 MongoDB 컬렉션 에 저장된 데이터를 모바일 애플리케이션 에서 읽는 방법을 보여줍니다. 읽기 작업은 쿼리 필터 를 사용하여 데이터베이스 에서 반환할 문서를 지정합니다. 읽기 작업은 Promise 를 반환합니다. 일치하는 단일 문서 ( 의 findOne()
경우), 숫자 값( 의 count()
경우) 또는 일치하는 문서 배열 ( 의 find()
경우) 중 하나로 해석됩니다.
단일 문서 찾기
collection.findOne()을 사용하여 하나의 문서를 찾을 수 있습니다.
다음 스니펫 은 매장 그룹의 판매 대상 식물을 설명하는 문서 컬렉션에서 파리지옥을 설명하는 문서를 찾습니다.
const venusFlytrap = await plants.findOne({ name: "venus flytrap" }); console.log("venusFlytrap", venusFlytrap);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
{ _id: ObjectId("5f87976b7b800b285345a8b4"), name: "venus flytrap", sunlight: "full", color: "white", type: "perennial", _partition: "Store 42", }
여러 문서 찾기
collection.find()를 사용하여 여러 문서를 찾을 수 있습니다.
다음 스니펫은 값이 'perennial'인 type
필드가 포함된 매장 그룹의 판매 대상 식물을 설명하는 문서 컬렉션 에서 모든 문서를 찾습니다.
const perennials = await plants.find({ type: "perennial" }); console.log("perennials", perennials);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
[ { _id: ObjectId("5f87976b7b800b285345a8b4"), name: "venus flytrap", sunlight: "full", color: "white", type: "perennial", _partition: "Store 42", }, { _id: ObjectId("5f87976b7b800b285345a8b6"), name: "thai basil", sunlight: "partial", color: "green", type: "perennial", _partition: "Store 42", }, ]
collection의 문서 수 계산
collection.count() 를 사용하여 컬렉션의 문서 수를 계산할 수 있습니다. 선택적 쿼리를 지정하여 계산할 문서를 결정할 수 있습니다. 쿼리를 지정하지 않으면 작업은 컬렉션의 모든 문서 수를 계산합니다.
다음 스니펫 은 매장 그룹에서 판매할 식물을 설명하는 문서 컬렉션의 문서 수를 계산합니다.
const numPlants = await plants.count(); console.log(`There are ${numPlants} plants in the collection`);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
"There are 5 plants in the collection"
문서 업데이트
이 코드 스니펫은 MongoDB 컬렉션 에 저장된 데이터를 모바일 애플리케이션 에서 업데이트 하는 방법을 보여줍니다. 업데이트 작업은 쿼리를 사용하여 업데이트 할 문서를 지정하고 업데이트 연산자 를 사용하여 쿼리 와 일치하는 문서를 변경하는 방법을 설명합니다. 업데이트 작업은 Promise 를 반환합니다. 작업 실행 결과를 포함하는 객체 로 확인됩니다.
단일 문서 업데이트
collection.updateOne()을 사용하여 단일 문서를 업데이트할 수 있습니다.
다음 스니펫 은 매장 그룹에서 판매할 식물을 설명하는 문서 컬렉션 에서 단일 문서를 업데이트합니다. 이 작업은 name
필드에 'petunia' 값이 포함된 문서를 쿼리하고 첫 번째 일치하는 문서의 sunlight
필드 값을 'partial'로 변경합니다.
const result = await plants.updateOne( { name: "petunia" }, { $set: { sunlight: "partial" } } ); console.log(result);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
{ matchedCount: 1, modifiedCount: 1 }
여러 문서 업데이트하기
collection.updateMany()를 사용하여 단일 문서를 업데이트할 수 있습니다.
다음 스니펫 은 매장 그룹에서 판매할 식물을 설명하는 문서 모음 에서 여러 문서를 업데이트합니다. 이 작업은 _partition
필드에 'Store 42' 값이 포함된 문서를 쿼리하고 일치하는 각 문서의 _partition
필드 값을 'Store 51'로 변경합니다.
const result = await plants.updateMany( { _partition: "Store 42" }, { $set: { _partition: "Store 51" } } ); console.log(result);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
{ matchedCount: 4, modifiedCount: 4 }
문서 업서트
업데이트 작업이 컬렉션의 문서와 일치하지 않는 경우 upsert
옵션을 true
로 설정하여 업데이트 쿼리와 일치하는 컬렉션에 새 문서 하나를 자동으로 삽입할 수 있습니다.
다음 스니펫은 매장 그룹의 판매 대상 식물을 설명하는 문서 컬렉션 문서를 업데이트하거나 쿼리와 일치하는 문서가 없는 경우 새 문서를 삽입합니다. 이 작업은 문서의 위치를 쿼리합니다:
sunlight
필드의 값은 "full입니다."type
필드의 값은 "perennial"입니다.color
필드의 값은 'green'입니다._partition
필드의 값은 'Store 47'입니다.
이 스니펫은 upsert
옵션을 true
로 설정하므로 쿼리와 일치하는 문서가 없으면 MongoDB는 쿼리와 지정된 업데이트를 모두 포함하는 새 문서를 만듭니다.
const result = await plants.updateOne( { sunlight: "full", type: "perennial", color: "green", _partition: "Store 47", }, { $set: { name: "super sweet basil" } }, { upsert: true } ); console.log(result);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
{ matchedCount: 0, modifiedCount: 0, upsertedId: ObjectId("5f1f63055512f2cb67f460a3"), }
문서 삭제
이 코드 스니펫은 MongoDB 컬렉션에 저장된 문서를 모바일 애플리케이션에서 삭제하는 방법을 보여줍니다. 삭제 작업은 쿼리를 사용하여 삭제할 문서를 지정하고 Promise 를 반환합니다. 작업 실행 결과를 포함하는 객체로 확인됩니다.
단일 문서 삭제
collection.deleteOne()을 사용하여 컬렉션에서 단일 문서를 삭제할 수 있습니다.
다음 스니펫 은 매장 그룹에서 판매할 식물을 설명하는 문서 모음에서 문서 하나를 삭제합니다. 이 작업은 color
필드 값이 '녹색'인 문서를 쿼리하고 일치하는 첫 번째 문서를 삭제합니다.
const result = await plants.deleteOne({ color: "green" }); console.log(result);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
{ deletedCount: 1 }
여러 문서 삭제
collection.deleteMany()를 사용하여 컬렉션에서 여러 항목을 삭제할 수 있습니다.
다음 스니펫 은 매장 그룹의 판매 대상 식물을 설명하는 문서 컬렉션에서 'Store 42'에 있는 식물에 대한 모든 문서를 삭제합니다.
const result = await plants.deleteMany({ _partition: "Store 42", }); console.log(result);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
{ deletedCount: 4 }
변화를 주시하세요
컬렉션의 문서가 추가, 수정 또는 삭제될 때마다 collection.watch()를 호출하여 실시간 알림 이벤트에 가입할 수 있습니다. 각 알림은 변경된 문서, 변경 방법, 이벤트를 발생시킨 작업 이후의 전체 문서를 명시합니다.
중요
서버리스 제한 사항
데이터 원본이 Atlas 서버리스 인스턴스인 경우 변경 사항을 모니터링할 수 없습니다. MongoDB 서버리스는 현재 변경 스트림을 지원하지 않습니다. 변경 스트림은 감시되는 컬렉션에서 변경 사항을 수신하는 데 사용됩니다.
Atlas App Services는 관찰 중인 collection에서 MongoDB 변경 스트림을 사용하여 변경 사항을 감지하고, 그에 대한 알림을 구독 중인 클라이언트 애플리케이션에 전송합니다. 이는 사용자가 온라인 상태인 동안 어떤 일이 일어났는지 알고 싶은 경우에 유용합니다. 예시:
배송 위치 추적
게임에 대한 최신 점수 및 통계 보기
사용자가 새 메시지를 보낼 때 채팅 스레드 업데이트하기
컬렉션의 모든 변경 사항 보기
컬렉션의 모든 변경 사항을 감시하려면 collection.watch()를 호출하세요. 인수 없이:
for await (const change of plants.watch()) { let breakAsyncIterator = false; // Later used to exit async iterator switch (change.operationType) { case "insert": { const { documentKey, fullDocument } = change; console.log(`new document: ${documentKey}`, fullDocument); breakAsyncIterator = true; break; } case "update": { const { documentKey, fullDocument } = change; console.log(`updated document: ${documentKey}`, fullDocument); breakAsyncIterator = true; break; } case "replace": { const { documentKey, fullDocument } = change; console.log(`replaced document: ${documentKey}`, fullDocument); breakAsyncIterator = true; break; } case "delete": { const { documentKey } = change; console.log(`deleted document: ${documentKey}`); breakAsyncIterator = true; break; } } if (breakAsyncIterator) break; // Exit async iterator }
필터로 컬렉션의 변경 사항 보기
collection의 특정 변경 사항을 관찰하려면 관찰할 변경 이벤트 값을 지정하는 쿼리와 함께 collection.watch() 를 호출합니다.
for await (const change of plants.watch({ filter: { operationType: "update", "fullDocument.type": "perennial", }, })) { // The change event will always represent a newly inserted perennial const { documentKey, fullDocument } = change; console.log(`new document: ${documentKey}`, fullDocument); break; // Exit async iterator }
문서 애그리게이션
집계 작업은 집계 파이프라인 이라는 일련의 단계를 통해 컬렉션의 모든 문서를 실행합니다. 애그리게이션을 사용하면 문서를 필터링 및 변환하고, 관련 문서 그룹에 대한 요약 데이터를 수집하는 등의 복잡한 데이터 작업을 수행할 수 있습니다.
집계 작업은 입력으로 집계 단계 목록을 받아들이며, 파이프라인에서 처리된 문서 컬렉션으로 해결되는 Promise 를 반환합니다.
collection의 문서 애그리게이션
collection.aggregate()를 사용하여 집계 파이프라인을 실행할 수 있습니다.
다음 스니펫은 type
값을 기준으로 plants
컬렉션의 모든 문서를 그룹화하고 각 유형의 개수를 집계합니다.
const result = await plants.aggregate([ { $group: { _id: "$type", total: { $sum: 1 }, }, }, { $sort: { _id: 1 } }, ]); console.log(result);
이 스니펫을 실행하면 다음과 같은 출력이 생성됩니다:
[ { _id: "annual", total: 3 }, { _id: "perennial", total: 2 }, ]
집계 단계
문서 필터링
$match 단계를 사용하여 표준 MongoDB 쿼리 구문에 따라 문서를 필터링할 수 있습니다.
{ "$match": { "<Field Name>": <Query Expression>, ... } }
예시
다음 $match
단계는 type
필드 값이 '다년생'인 문서만 포함하도록 필터링합니다.
const perennials = await plants.aggregate([ { $match: { type: { $eq: "perennial" } } }, ]); console.log(perennials);
[ { "_id": ObjectId("5f87976b7b800b285345a8c4"), "_partition": "Store 42", "color": "white", "name": "venus flytrap", "sunlight": "full", "type": "perennial" }, { "_id": ObjectId("5f87976b7b800b285345a8c6"), "_partition": "Store 42", "color": "green", "name": "thai basil", "sunlight": "partial", "type": "perennial" }, { "_id": ObjectId("5f87a0dffc9013565c233612"), "_partition": "Store 42", "color": "purple", "name": "wisteria lilac", "sunlight": "partial", "type": "perennial" }, { "_id": ObjectId("5f87a0dffc9013565c233613"), "_partition": "Store 42", "color": "yellow", "name": "daffodil", "sunlight": "full", "type": "perennial" }, { "_id": ObjectId("5f1f63055512f2cb67f460a3"), "_partition": "Store 47", "color": "green", "name": "sweet basil", "sunlight": "full", "type": "perennial" } ]
문서 그룹화
$group 단계를 사용하여 하나 이상의 문서에 대한 요약 데이터를 집계할 수 있습니다. MongoDB는 $group
단계의 _id
필드에 정의된 표현식을 기반으로 문서를 그룹화합니다. 필드 이름 앞에 $
를 붙여 특정 문서 필드를 참조할 수 있습니다.
{ "$group": { "_id": <Group By Expression>, "<Field Name>": <Aggregation Expression>, ... } }
예시
다음 $group
단계에서는 type
필드 값을 기준으로 문서를 정렬하고 각 고유 type
값이 나타나는 식물 문서 수를 계산합니다.
const result = await plants.aggregate([ { $group: { _id: "$type", numItems: { $sum: 1 }, }, }, { $sort: { _id: 1 } }, ]); console.log(result);
[ { _id: "annual", numItems: 1 }, { _id: "perennial", numItems: 5 }, ]
페이지 매김 문서
결과를 페이지로 나누려면 $match
, $sort
및 $limit
연산자와 함께 범위 집계 쿼리를 사용할 수 있습니다. 문서 페이지 매김에 대해 자세히 알아보려면 MongoDB Server 문서에서 범위 쿼리 사용하기를 참조하세요.
예시
다음 예시에서는 문서 컬렉션을 오름차순으로 페이지를 매깁니다.
// Paginates through list of plants // in ascending order by plant name (A -> Z) async function paginateCollectionAscending( collection, nPerPage, startValue ) { const pipeline = [{ $sort: { name: 1 } }, { $limit: nPerPage }]; // If not starting from the beginning of the collection, // only match documents greater than the previous greatest value. if (startValue !== undefined) { pipeline.unshift({ $match: { name: { $gt: startValue }, }, }); } const results = await collection.aggregate(pipeline); return results; } // Number of results to show on each page const resultsPerPage = 3; const pageOneResults = await paginateCollectionAscending( plants, resultsPerPage ); const pageTwoStartValue = pageOneResults[pageOneResults.length - 1].name; const pageTwoResults = await paginateCollectionAscending( plants, resultsPerPage, pageTwoStartValue ); // ... can keep paginating for as many plants as there are in the collection
문서 필드 프로젝트
$project 단계를 사용하여 문서의 특정 필드를 포함 또는 생략하거나 애그리게이션 연산자 를 사용하여 새 필드를 계산할 수 있습니다. 프로젝션은 두 가지 방식으로 작동합니다.
값이 '1'인 필드를 명시적으로 포함합니다. 이 방법에는 지정되지 않은 모든 필드를 암시적으로 제외하는 부작용이 있습니다.
값이 '0'인 필드를 암시적으로 제외합니다. 이 방법에는 지정되지 않은 모든 필드를 암시적으로 포함하는 부작용이 있습니다.
이 두 가지 프로젝션 방법은 상호 배타적입니다. 필드를 명시적으로 포함하는 경우 필드를 명시적으로 제외할 수 없으며 그 반대의 경우도 마찬가지입니다.
참고
_id
필드는 특별한 경우에 해당하며 명시적으로 지정하지 않는 한 항상 모든 쿼리에 포함됩니다. 따라서 0
값이 있는 _id
필드를 제외하는 동시에 1
을 사용해 _partition
등의 다른 필드를 포함하는 것이 가능합니다. _id
필드를 제외하는 특수한 경우에만 하나의 $project
단계에서 제외와 포함을 동시에 적용할 수 있습니다.
{ "$project": { "<Field Name>": <0 | 1 | Expression>, ... } }
예시
다음 $project
단계에서는 _id
필드를 생략하고 name
필드를 포함하며 storeNumber
라는 새 필드를 생성합니다. storeNumber
는 다음 집계 연산자 두 개를 사용하여 생성됩니다.
$split
값_partition
을 공백 문자를 둘러싼 두 개의 문자열 세그먼트로 분리합니다. 예를 들어 이처럼 '매장 42'로 분할된 값은 다음과 같이 '매장' 및 '42'의 두 개의 요소가 있는 배열을 반환합니다.$arrayElemAt
두 번째 인수를 기반으로 배열에서 특정 요소를 선택합니다. 이 경우 배열 인덱스는0
이므로 값1
은$split
연산자로 생성된 배열에서 두 번째 요소를 선택합니다. 예를 들어 이 연산에 전달된 값 ['매장', '42']는 값 '42'를 반환합니다.
const result = await plants.aggregate([ { $project: { _id: 0, name: 1, storeNumber: { $arrayElemAt: [{ $split: ["$_partition", " "] }, 1], }, }, }, ]); console.log(result);
[ { "name": "venus flytrap", "storeNumber": "42" }, { "name": "thai basil", "storeNumber": "42" }, { "name": "helianthus", "storeNumber": "42" }, { "name": "wisteria lilac", "storeNumber": "42" }, { "name": "daffodil", "storeNumber": "42" }, { "name": "sweet basil", "storeNumber": "47" } ]
문서에 필드 추가
$addFields 단계에서 애그리게이션 연산자를 사용하여 계산된 값이 있는 새 필드를 추가할 수 있습니다.
{ $addFields: { <newField>: <expression>, ... } }
참고
$addFields
는 $project와 유사하지만 필드를 포함하거나 생략할 수 없습니다.
예시
다음 $addFields
단계에서는 storeNumber
라는 새 필드를 만듭니다. 여기서 값은 _partition
필드의 값을 변환하는 두 집계 연산자의 출력입니다.
const result = await plants.aggregate([ { $addFields: { storeNumber: { $arrayElemAt: [{ $split: ["$_partition", " "] }, 1], }, }, }, ]); console.log(result);
[ { "_id": ObjectId("5f87976b7b800b285345a8c4"), "_partition": "Store 42", "color": "white", "name": "venus flytrap", "storeNumber": "42", "sunlight": "full", "type": "perennial" }, { "_id": ObjectId("5f87976b7b800b285345a8c6"), "_partition": "Store 42", "color": "green", "name": "thai basil", "storeNumber": "42", "sunlight": "partial", "type": "perennial" }, { "_id": ObjectId("5f87976b7b800b285345a8c7"), "_partition": "Store 42", "color": "yellow", "name": "helianthus", "storeNumber": "42", "sunlight": "full", "type": "annual" }, { "_id": ObjectId("5f87a0dffc9013565c233612"), "_partition": "Store 42", "color": "purple", "name": "wisteria lilac", "storeNumber": "42", "sunlight": "partial", "type": "perennial" }, { "_id": ObjectId("5f87a0dffc9013565c233613"), "_partition": "Store 42", "color": "yellow", "name": "daffodil", "storeNumber": "42", "sunlight": "full", "type": "perennial" }, { "_id": ObjectId("5f1f63055512f2cb67f460a3"), "_partition": "Store 47", "color": "green", "name": "sweet basil", "storeNumber": "47", "sunlight": "full", "type": "perennial" } ]
배열 값 풀기
$unwind 단계를 사용하여 배열이 포함된 단일 문서를 해당 배열의 개별 값이 포함된 여러 문서로 변환할 수 있습니다. 배열 필드를 풀면 MongoDB는 배열 필드의 각 요소에 대해 각 문서를 한 번씩 복사하지만 배열 값을 각 사본의 배열 요소로 바꿉니다.
{ $unwind: { path: <Array Field Path>, includeArrayIndex: <string>, preserveNullAndEmptyArrays: <boolean> } }
예시
다음 예시에서는 각 객체의 type
및 color
조합에 대해 $unwind
단계를 사용합니다. 집계 파이프라인은 다음과 같은 단계로 이루어져 있습니다.
$addToSet
를 포함해$group
단계를 사용하여 컬렉션에 있는 해당 꽃 유형의 모든 색상 배열을 포함하는 새 필드colors
를 사용하여 각type
별로 새 문서를 생성합니다.$unwind
단계를 사용하여 각 유형 및 색상 조합에 대해 별도의 문서를 생성합니다.$sort
단계를 사용하여 결과를 알파벳 순서로 정렬합니다.
const result = await plants.aggregate([ { $group: { _id: "$type", colors: { $addToSet: "$color" } } }, { $unwind: { path: "$colors" } }, { $sort: { _id: 1, colors: 1 } }, ]); console.log(result);
[ { "_id": "annual", "colors": "yellow" }, { "_id": "perennial", "colors": "green" }, { "_id": "perennial", "colors": "purple" }, { "_id": "perennial", "colors": "white" }, { "_id": "perennial", "colors": "yellow" }, ]