집계 파이프라인으로 업데이트.
이 페이지의 내용
업데이트 작업을 수행하려면 집계 파이프라인을 사용할 수 있습니다. 집계 파이프라인을 빌드하고 실행하여 MongoDB Atlas, MongoDB Compass, MongoDB Shell 또는 Drivers에서 업데이트를 수행할 수 있습니다.
업데이트 작업을 통해 집계 파이프라인을 다음 단계로 구성할 수 있습니다.
집계 파이프라인e을 사용하면 현재 필드 값을 기반으로 조건부 업데이트를 표현하거나 다른 필드의 값을 사용하여 한 필드를 업데이트하는 등 보다 표현력이 풍부한 업데이트 구문을 작성할 수 있습니다.
Atlas에서 업데이트 집계 파이프라인 업데이트 생성
MongoDB Atlas UI를 사용하여 업데이트를 수행하는 집계 파이프라인을 구축할 수 있습니다. MongoDB Atlas UI에서 집계 파이프라인을 생성하고 실행하려면 Project Data Access Read Only
역할이나 그 이상을 보유해야 합니다.
업데이트를 수행할 집계 파이프라인을 생성합니다.
집계 단계를 선택합니다.
왼쪽 하단 패널의 Select 드롭다운 메뉴에서 집계 단계를 선택합니다.
드롭다운 메뉴 오른쪽에 있는 토글은 해당 단계의 활성화 여부를 나타냅니다.
다음 단계 중 하나를 실행하여 집계 업데이트를 수행합니다.
집계 단계를 입력합니다.
적절한 값으로 단계를 채웁니다. 댓글 모드가 활성화된 경우 파이프라인 빌더는 선택한 단계에 대한 구문 지침을 제공합니다.
단계를 수정하면 Atlas는 현재 단계의 결과를 기반으로 오른쪽에 있는 미리보기 문서를 업데이트합니다.
집계 단계에 포함할 수 있는 항목의 예시는 이 페이지의 예시에서 확인 가능합니다.
필요에 따라 단계를 추가합니다. Atlas에서 집계 파이프라인을 생성하는 방법에 대한 자세한 내용은 집계 파이프라인 생성에서 확인 가능합니다.
집계 파이프라인을 내보냅니다.
언어로 내보내기를 클릭합니다.
이 버튼은 파이프라인 빌더 상단에서 찾을 수 있습니다.
원하는 내보내기 언어를 선택합니다.
Export Pipeline To 메뉴에서 원하는 언어를 선택합니다.
왼쪽의 My Pipeline 창에는 파이프라인이 MongoDB Shell 구문으로 표시됩니다. 이를 직접 복사하여 MongoDB Shell에서 파이프라인을 실행할 수 있습니다.
오른쪽 창에 파이프라인이 선택된 언어로 표시됩니다. 선호하는 언어를 선택합니다.
원하는 경우 옵션을 선택합니다.
(선택 사항): 택한 언어에 필요한 가져오기(import) 명령문을 포함하려면 Include Import Statements 옵션을 선택하세요.
(선택사항): 드라이버에 특정된 코드를 포함하려면 Include Driver Syntax 옵션을 선택합니다.
클라이언트 초기화
데이터베이스 및 컬렉션 지정
집계 작업 수행
파이프라인을 복사합니다.
파이프라인 오른쪽 상단에 있는 Copy 버튼을 클릭하여 선택한 언어의 파이프라인을 클립보드에 복사합니다. 복사한 파이프라인을 애플리케이션에 붙여넣습니다.
예시
다음 예시에서는 집계 파이프라인 단계 $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()
let 변수를 사용하여 업데이트
버전 5.0에 추가.
명령의 다른 곳에서 액세스할 수 있는 변수를 정의하려면 let 옵션을 사용합니다.
참고
변수를 사용하여 결과를 필터링하려면 $expr
연산자 내에서 변수에 액세스해야 합니다.
컬렉션 cakeFlavors
을 만듭니다:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
다음 updateOne
명령은 let
옵션으로 설정된 변수를 사용합니다.
targetFlavor
변수는cherry
로 설정됩니다. 이 변수는$eq
표현식에서 일치 필터를 지정하는 데 사용됩니다.newFlavor
변수는orange
로 설정됩니다. 이 변수는$set
연산자에서 일치하는 문서에 대해 업데이트된flavor
값을 지정하는 데 사용됩니다.
db.cakeFlavors.updateOne( { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, [ { $set: { flavor: "$$newFlavor" } } ], { let: { targetFlavor: "cherry", newFlavor: "orange" } } )
앞의 업데이트 작업을 실행하고 나면 cakeFlavors
컬렉션에는 다음 문서가 포함됩니다.
[ { _id: 1, flavor: 'chocolate' }, { _id: 2, flavor: 'strawberry' }, { _id: 3, flavor: 'orange' } ]
추가 예시
여러 업데이트 방법 페이지에서 추가 예시를 확인 가능합니다.