문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

애그리게이션 파이프라인으로 업데이트.

이 페이지의 내용

  • Atlas에서 업데이트 애그리게이션 파이프라인 업데이트 생성
  • 애그리게이션셔 파이프라인 빌더에 액세스합니다.
  • 업데이트를 수행할 애그리게이션셔 파이프라인을 생성합니다.
  • 애그리게이션 파이프라인을 내보냅니다.
  • 예제
  • $set이 포함된 updateOne
  • $replaceRoot 및 $set이 포함된 updateMany
  • $set이 포함된 updateMany
  • $set이 포함된 updateOne
  • $addFields가 포함된 updateMany
  • 추가 예제

MongoDB 4 부터 시작.2, 업데이트 작업에 집계 파이프라인을 사용할 수 있습니다. 집계 파이프라인을 빌드하고 실행하여 MongoDB Atlas, MongoDB Compass, MongoDB Shell 또는 드라이버에서 업데이트를 수행할 수 있습니다.

업데이트 작업을 통해 애그리게이션 파이프라인을 다음 단계로 구성할 수 있습니다.

Aggregation pipeline을 사용하면 현재 필드 값을 기반으로 조건부 업데이트를 표현하거나 다른 필드의 값을 사용하여 한 필드를 업데이트하는 등 보다 표현력이 풍부한 업데이트 구문을 작성할 수 있습니다.

MongoDB Atlas UI를 사용하여 업데이트를 수행하는 집계 파이프라인을 구축할 수 있습니다. MongoDB Atlas UI에서 집계 파이프라인을 생성하고 실행하려면 Project Data Access Read Only 이상의 역할이 있어야 합니다.

1
1

왼쪽의 기본 패널과 Namespaces에는 데이터베이스의 컬렉션이 나열됩니다.

2

왼쪽 또는 메인 패널에서 컬렉션을 선택합니다. 기본 패널에는 Find, IndexesAggregation 보기가 표시됩니다.

3

Aggregation 보기를 처음 열면 Atlas에 빈 애그리게이션 파이프라인이 표시됩니다.

2
1

왼쪽 하단 패널의 Select 드롭다운 메뉴에서 애그리게이션 단계를 선택합니다.

드롭다운 메뉴 오른쪽에 있는 토글은 해당 단계의 활성화 여부를 나타냅니다.

다음 단계 중 하나를 실행하여 애그리게이션 업데이트를 수행합니다.

2

단계를 적절한 값으로 채웁니다. 댓글 모드 가 활성화된 경우 파이프라인 빌더는 선택한 단계에 대한 구문 지침을 제공합니다.

단계를 수정하면 Atlas는 현재 단계의 결과를 기반으로 오른쪽에 있는 미리보기 문서를 업데이트합니다.

애그리게이션 단계에 포함할 수 있는 항목의 예는 이 페이지의 를 참조하세요.

필요에 따라 단계를 추가합니다. Atlas에서 집계 파이프라인을 생성 하는 방법에 대한 자세한 내용은 집계 파이프라인 생성을 참조하세요.

3
1

이 버튼은 파이프라인 빌더 상단에서 찾을 수 있습니다.

2

Export Pipeline To 메뉴에서 원하는 언어를 선택합니다.

왼쪽의 My Pipeline 창에는 파이프라인이 MongoDB 셸 구문으로 표시됩니다. 이를 직접 복사하여 MongoDB 셸에서 파이프라인을 실행할 수 있습니다.

오른쪽 창에 파이프라인이 선택된 언어로 표시됩니다. 선호하는 언어를 선택합니다.

3

(선택 사항): 택한 언어에 필요한 가져오기(import) 명령문을 포함하려면 Include Import Statements 옵션을 선택하세요.

(선택사항): 드라이버에 특정된 코드를 포함하려면 Include Driver Syntax 옵션을 선택합니다.

  • 클라이언트 초기화

  • 데이터베이스 및 컬렉션 지정

  • 애그리게이션 작업 수행

4

파이프라인 오른쪽 상단에 있는 Copy 버튼을 클릭하여 선택한 언어의 파이프라인을 클립보드에 복사합니다. 복사한 파이프라인을 애플리케이션에 붙여넣습니다.

다음 예시에서는 애그리게이션 파이프라인 단계 $set, $replaceRoot$addFields를 사용하여 업데이트를 수행하는 방법을 확인할 수 .있습니다

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()

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, test1test2 필드의 기본값을 설정합니다. 애그리게이션 변수 ROOT는 수정 중인 현재 문서를 나타냅니다. 변수에 액세스하려면 접두사에 $$를 붙이고 따옴표로 묶습니다. 현재 문서 필드가 기본값을 재정의합니다.

  • $set 단계로 modified 필드를 현재 날짜/시간으로 업데이트합니다. 이 작업은 현재 날짜/시간에 애그리게이션 변수 NOW를 사용합니다. 변수에 액세스하려면 접두사 앞에 $$를 붙이고 따옴표로 묶습니다.

컬렉션을 쿼리하여 업데이트를 확인할 수 있습니다.

db.students2.find()

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를 사용합니다. 변수에 액세스하려면 접두사에 $$를 붙이고 따옴표로 묶습니다.

  • $switch 표현식을 사용하여 average를 바탕으로 grade 필드를 추가하는 $set 단계입니다.

컬렉션을 쿼리하여 업데이트를 확인할 수 있습니다.

db.students3.find()

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()

섭씨 온도를 포함하는 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()

여러 업데이트 방법 페이지에서 추가 예시를 확인 가능합니다.

← 문서 업데이트