집계 파이프라인을 사용하여 업데이트 작업을 수행합니다. 다음에서 이러한 파이프라인을 빌드 하고 실행할 수 있습니다.
업데이트를 위한 집계 파이프라인은 다음 단계를 지원 .
집계 파이프라인을 사용하면 다음과 같은 표현식 업데이트가 활성화 .
현재 필드 값에 따른 조건부 업데이트
다른 필드에서 필드 값 설정
참고
필드 값의 달러 문자
집계 파이프라인 사용하는 경우 사용자 입력에서 전달되거나 데이터 구문 분석을 통해 동적으로 생성된 문자열을 모두 삭제합니다. 필드 값이 리터럴 문자열 값이고 달러 문자로 시작하는 경우 해당 값을 $literal 집계 연산자에 전달해야 합니다. 다음 예시 집계 파이프라인 $set 및 $literal 연산자 사용하여 1 의 _id 가 있는 문서 cost 필드 $27로 업데이트 방법을 보여 줍니다.
db.inventory.updateOne( { _id: 1 }, [ { $set: { "cost": { $literal: "$27" } } } ] )
Atlas에서 업데이트 집계 파이프라인 업데이트 생성
집계 파이프라인을 빌드 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"} } ] )
파이프라인 문서 에 $set test3 필드 추가하고(그리고 해당 값을 로 98 설정) 필드 modified 현재 날짜/시간으로 설정하는 단계로 구성됩니다. 이 작업은 현재 날짜/시간에 NOW 집계 변수 을(를) 사용합니다. 변수에 액세스 하려면 접두사 $$ 앞에 를 붙이고 따옴표로 묶습니다.
확인하려면 다음과 같이 collection을 쿼리하세요.
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를 사용합니다. 변수에 액세스하려면 접두사 앞에$$를 붙이고 따옴표로 묶습니다.
확인하려면 다음과 같이 collection을 쿼리하세요.
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를 사용합니다. 변수에 액세스하려면 접두사에$$를 붙이고 따옴표로 묶습니다.
확인하려면 다음과 같이 collection을 쿼리하세요.
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 ] ] } } } ] )
확인하려면 다음과 같이 collection을 쿼리하세요.
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 ] } } } } } ] )
파이프라인 $addFields 화씨 온도를 포함하는 새 배열 필드 를 추가하는 단계로 tempsF 구성됩니다. 배열 의 각 섭씨온도를 tempsC 화씨로 변환하기 위해 이 단계에서는 표현식 및 표현식과 함께 $map $add $multiply 사용합니다.
확인하려면 다음과 같이 collection을 쿼리하세요.
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' } ]
추가 예시
더 많은 예시는 다음 페이지를 참조하세요.