Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ /

집계 파이프라인으로 업데이트.

이 페이지의 내용

  • Atlas에서 업데이트 집계 파이프라인 업데이트 생성
  • 집계 파이프라인 빌더에 액세스합니다.
  • 업데이트를 수행할 집계 파이프라인을 생성합니다.
  • 집계 파이프라인을 내보냅니다.
  • 예시
  • $set이 포함된 updateOne
  • $replaceRoot 및 $set이 포함된 updateMany
  • $set이 포함된 updateMany
  • $set이 포함된 updateOne
  • $addFields가 포함된 updateMany
  • let 변수를 사용하여 업데이트
  • 추가 예시

업데이트 작업을 수행하려면 집계 파이프라인을 사용할 수 있습니다. MongoDB Atlas, MongoDB Compass, MongoDB Shell, 드라이버에서 업데이트를 수행하기 위해 집계 파이프라인을 구축하고 실행할 수 있습니다.

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

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

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 Shell 구문으로 표시됩니다. 이를 직접 복사하여 MongoDB Shell에서 파이프라인을 실행할 수 있습니다.

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

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

버전 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' }
]

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

돌아가기

Update