문서 홈 → 애플리케이션 개발 → MongoDB 매뉴얼
애그리게이션 파이프라인으로 업데이트.
이 페이지의 내용
MongoDB 4 부터 시작.2, 업데이트 작업에 집계 파이프라인을 사용할 수 있습니다. 집계 파이프라인을 빌드하고 실행하여 MongoDB Atlas, MongoDB Compass, MongoDB Shell 또는 드라이버에서 업데이트를 수행할 수 있습니다.
업데이트 작업을 통해 애그리게이션 파이프라인을 다음 단계로 구성할 수 있습니다.
Aggregation pipeline을 사용하면 현재 필드 값을 기반으로 조건부 업데이트를 표현하거나 다른 필드의 값을 사용하여 한 필드를 업데이트하는 등 보다 표현력이 풍부한 업데이트 구문을 작성할 수 있습니다.
Atlas에서 업데이트 애그리게이션 파이프라인 업데이트 생성
MongoDB Atlas UI를 사용하여 업데이트를 수행하는 집계 파이프라인을 구축할 수 있습니다. MongoDB Atlas UI에서 집계 파이프라인을 생성하고 실행하려면 Project Data Access Read Only
이상의 역할이 있어야 합니다.
업데이트를 수행할 애그리게이션셔 파이프라인을 생성합니다.
애그리게이션 단계를 입력합니다.
단계를 적절한 값으로 채웁니다. 댓글 모드 가 활성화된 경우 파이프라인 빌더는 선택한 단계에 대한 구문 지침을 제공합니다.
단계를 수정하면 Atlas는 현재 단계의 결과를 기반으로 오른쪽에 있는 미리보기 문서를 업데이트합니다.
애그리게이션 단계에 포함할 수 있는 항목의 예는 이 페이지의 예 를 참조하세요.
필요에 따라 단계를 추가합니다. Atlas에서 집계 파이프라인을 생성 하는 방법에 대한 자세한 내용은 집계 파이프라인 생성을 참조하세요.
예제
다음 예시에서는 애그리게이션 파이프라인 단계 $set
, $replaceRoot
및 $addFields
를 사용하여 업데이트를 수행하는 방법을 확인할 수 .있습니다
$set이 포함된 updateOne
students
예시 컬렉션을 생성합니다(현재 컬렉션이 존재하지 않는 경우 삽입 작업을 수행하면 생성 가능합니다).
db.students.insertMany( [ { _id: 1, test1: 95, test2: 92, test3: 90, modified: new Date("01/05/2020") }, { _id: 2, test1: 98, test2: 100, test3: 102, modified: new Date("01/05/2020") }, { _id: 3, test1: 95, test2: 110, modified: new Date("01/04/2020") } ] )
확인하려면 다음과 같이 collection을 쿼리하세요.
db.students.find()
다음 db.collection.updateOne()
작업은 애그리게이션 파이프라인을 사용하여 문서를 _id: 3
으로 업데이트합니다.
db.students.updateOne( { _id: 3 }, [ { $set: { "test3": 98, modified: "$$NOW"} } ] )
특히 파이프라인은 test3
필드를 문서에 추가하고 해당 값을 98
로 설정하며 modified
필드를 현재 날짜/시간으로 설정하는 $set
단계로 구성됩니다. 이 작업은 현재 날짜/시간에 대해 애그리게이션 변수 NOW
를 사용합니다. 변수에 액세스하려면 접두사 앞에 $$
를 붙이고 따옴표로 묶습니다.
컬렉션을 쿼리하여 업데이트를 확인할 수 있습니다.
db.students.find().pretty()
$replaceRoot 및 $set이 포함된 updateMany
students2
예시 컬렉션을 생성합니다(현재 컬렉션이 존재하지 않는 경우 삽입 작업을 수행하면 생성 가능합니다).
db.students2.insertMany( [ { "_id" : 1, quiz1: 8, test2: 100, quiz2: 9, modified: new Date("01/05/2020") }, { "_id" : 2, quiz2: 5, test1: 80, test2: 89, modified: new Date("01/05/2020") }, ] )
확인하려면 다음과 같이 collection을 쿼리하세요.
db.students2.find()
다음 db.collection.updateMany()
작업은 애그리게이션 파이프라인을 사용하여 문서의 필드를 표준화하며(즉, 컬렉션의 문서에 동일한 필드가 포함) modified
필드를 업데이트합니다.
db.students2.updateMany( {}, [ { $replaceRoot: { newRoot: { $mergeObjects: [ { quiz1: 0, quiz2: 0, test1: 0, test2: 0 }, "$$ROOT" ] } } }, { $set: { modified: "$$NOW"} } ] )
구체적으로 파이프라인은 다음과 같이 구성됩니다:
$mergeObjects
표현식이 있는$replaceRoot
단계를 사용하여quiz1
,quiz2
,test1
및test2
필드의 기본값을 설정합니다. 애그리게이션 변수ROOT
는 수정 중인 현재 문서를 나타냅니다. 변수에 액세스하려면 접두사에$$
를 붙이고 따옴표로 묶습니다. 현재 문서 필드가 기본값을 재정의합니다.$set
단계로modified
필드를 현재 날짜/시간으로 업데이트합니다. 이 작업은 현재 날짜/시간에 애그리게이션 변수NOW
를 사용합니다. 변수에 액세스하려면 접두사 앞에$$
를 붙이고 따옴표로 묶습니다.
컬렉션을 쿼리하여 업데이트를 확인할 수 있습니다.
db.students2.find()
$set이 포함된 updateMany
students3
예시 컬렉션을 생성합니다(현재 컬렉션이 존재하지 않는 경우 삽입 작업을 수행하면 생성 가능합니다).
db.students3.insertMany( [ { "_id" : 1, "tests" : [ 95, 92, 90 ], "modified" : ISODate("2019-01-01T00:00:00Z") }, { "_id" : 2, "tests" : [ 94, 88, 90 ], "modified" : ISODate("2019-01-01T00:00:00Z") }, { "_id" : 3, "tests" : [ 70, 75, 82 ], "modified" : ISODate("2019-01-01T00:00:00Z") } ] );
확인하려면 다음과 같이 collection을 쿼리하세요.
db.students3.find()
다음 db.collection.updateMany()
작업은 애그리게이션 파이프라인을 사용하여 계산된 평균 등급 및 알파벳 등급으로 문서를 업데이트합니다.
db.students3.updateMany( { }, [ { $set: { average : { $trunc: [ { $avg: "$tests" }, 0 ] }, modified: "$$NOW" } }, { $set: { grade: { $switch: { branches: [ { case: { $gte: [ "$average", 90 ] }, then: "A" }, { case: { $gte: [ "$average", 80 ] }, then: "B" }, { case: { $gte: [ "$average", 70 ] }, then: "C" }, { case: { $gte: [ "$average", 60 ] }, then: "D" } ], default: "F" } } } } ] )
구체적으로 파이프라인은 다음과 같이 구성됩니다:
tests
배열 요소의 잘린 평균값을 계산하고modified
필드를 현재 날짜/시간으로 업데이트하는$set
단계입니다. 잘린 평균을 계산하기 위해 이 단계에서는$avg
및$trunc
표현식을 사용합니다. 이 작업에서는 현재 날짜/시간에 애그리게이션 변수NOW
를 사용합니다. 변수에 액세스하려면 접두사에$$
를 붙이고 따옴표로 묶습니다.
컬렉션을 쿼리하여 업데이트를 확인할 수 있습니다.
db.students3.find()
$set이 포함된 updateOne
students4
예시 컬렉션을 생성합니다(현재 컬렉션이 존재하지 않는 경우 삽입 작업을 수행하면 생성 가능합니다).
db.students4.insertMany( [ { "_id" : 1, "quizzes" : [ 4, 6, 7 ] }, { "_id" : 2, "quizzes" : [ 5 ] }, { "_id" : 3, "quizzes" : [ 10, 10, 10 ] } ] )
확인하려면 다음과 같이 collection을 쿼리하세요.
db.students4.find()
다음 db.collection.updateOne()
작업은 애그리게이션 파이프라인을 사용하여 _id:
2
가 있는 문서에 퀴즈 점수를 추가합니다:
db.students4.updateOne( { _id: 2 }, [ { $set: { quizzes: { $concatArrays: [ "$quizzes", [ 8, 6 ] ] } } } ] )
컬렉션을 쿼리하여 업데이트를 확인할 수 있습니다.
db.students4.find()
$addFields가 포함된 updateMany
섭씨 온도를 포함하는 temperatures
컬렉션 예시를 생성합니다(컬렉션이 현재 존재하지 않는 경우 삽입 작업을 수행하면 생성 가능합니다).
db.temperatures.insertMany( [ { "_id" : 1, "date" : ISODate("2019-06-23"), "tempsC" : [ 4, 12, 17 ] }, { "_id" : 2, "date" : ISODate("2019-07-07"), "tempsC" : [ 14, 24, 11 ] }, { "_id" : 3, "date" : ISODate("2019-10-30"), "tempsC" : [ 18, 6, 8 ] } ] )
확인하려면 다음과 같이 collection을 쿼리하세요.
db.temperatures.find()
다음 db.collection.updateMany()
작업은 애그리게이션 파이프라인을 사용하여 화씨 단위의 해당 온도로 문서를 업데이트합니다:
db.temperatures.updateMany( { }, [ { $addFields: { "tempsF": { $map: { input: "$tempsC", as: "celsius", in: { $add: [ { $multiply: ["$$celsius", 9/5 ] }, 32 ] } } } } } ] )
특히 이 파이프라인은 화씨온도를 포함하는 새 배열 필드 tempsF
를 추가하는 $addFields
단계로 구성됩니다. tempsC
배열의 각 섭씨온도를 화씨로 변환하기 위해 이 단계는 $map
표현식을 $add
및 $multiply
표현식과 함께 사용합니다.
컬렉션을 쿼리하여 업데이트를 확인할 수 있습니다.
db.temperatures.find()
추가 예제
여러 업데이트 방법 페이지에서 추가 예시를 확인 가능합니다.