문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ / /

db.collection.updateMany()

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 액세스 제어
  • 행동
  • 예제
db.collection.updateMany(filter, update, options)

중요

Mongo쉬 방법

이 페이지에서는 mongosh 메서드를 설명합니다. 이는 데이터베이스 명령 또는 Node.js와 같은 언어별 드라이버에 대한 설명서가 아닙니다.

데이터베이스 명령에 대해서는 update 명령을 참조하세요.

MongoDB API 드라이버의 경우 언어별 MongoDB 드라이버 설명서를 참조하세요.

컬렉션에 대해 지정된 필터와 일치하는 모든 문서를 업데이트합니다.

다음 환경에서 호스팅되는 배포에 db.collection.updateMany() 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

updateMany() 메서드의 형식은 다음과 같습니다.

db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>,
let: <document>
}
)

updateMany() 메서드는 다음 매개변수를 사용합니다.

매개 변수
유형
설명
문서

업데이트의 선택 기준입니다. 메서드와 동일한 쿼리 선택기find() 사용할 수 있습니다.

의 컬렉션모든 문서를 업데이트하려면 빈 문서 { }를 지정합니다.

문서 또는 파이프라인

수정 사항을 적용합니다. 다음 중 하나일 수 있습니다.

업데이트 연산자 표현식만 포함합니다.

자세한 내용은 업데이트 연산자 표현식 문서로 업데이트를 참조하세요.

다음 집계 단계만 포함합니다.

자세한 내용은 집계 파이프라인으로 업데이트를 참조하세요.

대체 문서로 업데이트하려면 db.collection.replaceOne()을 참조하십시오.

upsert
부울

선택 사항입니다. true인 경우 updateMany()는 다음 작업 중 한 가지를 실행합니다.

  • 0}과 일치하는 문서가 없는 filter 경우 새 문서를 만듭니다. 자세한 내용은 upsert 동작을 참조하세요.

  • filter와 일치하는 문서를 업데이트합니다.

업서트가 여러 번 발생하지 않도록 하려면 filter 필드를 고유하게 인덱싱해야 합니다.

기본값은 false입니다.

writeConcern
문서

선택 사항입니다. 쓰기 고려를 표현하는 문서입니다. 기본 쓰기 고려를 사용하지 않으려면 생략하세요.

트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.

collation
문서

선택 사항.

작업에 사용할 데이터 정렬을 지정합니다.

데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.

데이터 정렬 옵션의 구문은 다음과 같습니다:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

데이터 정렬을 지정할 때 locale 필드는 필수이고, 다른 데이터 정렬 필드는 모두 선택 사항입니다. 필드에 대한 설명은 데이터 정렬 문서를 참조하세요.

데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( db.createCollection() 참조), 작업은 컬렉션에 지정된 데이터 정렬을 사용합니다.

컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다.

한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다.

버전 3.4에 새로 추가되었습니다.

arrayFilters
배열

선택 사항입니다. 필터 문서의 배열로, 배열 필드에 대한 업데이트 작업을 위해 수정할 배열 요소를 결정합니다.

업데이트 문서에서 $[<identifier>] 필터링된 위치 연산자를 사용하여 식별자를 정의한 다음 배열 필터 문서에서 이를 참조합니다. 식별자가 업데이트 문서에 포함되어 있지 않으면 식별자에 대한 배열 필터 문서를 가질 수 없습니다.

참고

<identifier>는 소문자로 시작해야 하며 영숫자만 포함할 수 있습니다.

업데이트 문서에 동일한 식별자를 여러 번 포함할 수 있지만, 업데이트 문서의 각 고유 식별자($[identifier])에 대해 해당하는 배열 필터 문서를 정확히 하나씩 지정해야 합니다. 즉, 동일한 식별자에 대해 여러 개의 배열 필터 문서를 지정할 수 없습니다. 예를 들어, 업데이트 문에 식별자 x가 포함된 경우(여러 번), x에 대한 별도의 필터 문서 2개가 포함된 arrayFilters에 대해 다음을 지정할 수 없습니다.

// INVALID
[
{ "x.a": { $gt: 85 } },
{ "x.b": { $gt: 80 } }
]

그러나 다음 예시와 같이 단일 필터 문서에서 동일한 식별자에 복합 조건을 지정할 수 있습니다.

// Example 1
[
{ $or: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
// Example 2
[
{ $and: [{"x.a": {$gt: 85}}, {"x.b": {$gt: 80}}] }
]
// Example 3
[
{ "x.a": { $gt: 85 }, "x.b": { $gt: 80 } }
]

예시는 배열 업데이트 연산에 arrayFilters 지정하기를 참조하세요.

버전 3.6에 새로 추가되었습니다.

문서 또는 문자열

선택 사항입니다. 쿼리 조건자를 지원하는 데 사용할 인덱스를 지정하는 문서 또는 문자열입니다.

이 옵션은 인덱스 사양 문서 또는 인덱스 이름 문자열을 사용할 수 있습니다.

존재하지 않는 인덱스를 지정하면 연산 오류가 발생합니다.

예시를 보려면 업데이트 작업에 대해 hint 지정을 참조하세요.

let
문서

선택 사항.

변수 목록이 있는 문서를 지정합니다. 이를 통해 쿼리 텍스트에서 변수를 분리하여 명령 가독성을 향상시킬 수 있습니다.

문서 구문은 다음과 같습니다:

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

변수는 표현식에서 반환된 값으로 설정되며 이후에는 변경할 수 없습니다.

명령에서 변수 값에 액세스하려면 $$<variable_name> 형식의 이중 달러 기호 접두사 ($$) 를 변수 이름과 함께 사용하십시오.예: $$targetTotal.

참고

변수를 사용하여 결과를 필터링하려면 $expr 연산자 내에서 변수에 액세스해야 합니다.

let 및 변수를 사용하는 완전한 예시를 보려면 let 변수로 업데이트를 참조하세요.

이 메서드는 다음을 포함하는 문서를 반환합니다.

  • 쓰기 고려로 작업이 실행된 경우 부울 acknowledgedtrue로, 쓰기 고려가 비활성화된 경우 부울을 false로 설정합니다.

  • matchedCount - 매칭된 문서의 수를 포함

  • modifiedCount - 수정된 문서 수를 포함

  • upsertedId upserted 문서의 _id이(가) 포함된 [upsertedId]

  • upsertedCount 업서트된 문서 수를 포함하는

authorization으로 실행되는 배포에서 사용자에게 다음 권한이 포함된 액세스 권한이 있어야 합니다.

  • update 지정된 컬렉션에 대한 조치입니다.

  • find 지정된 컬렉션에 대한 조치입니다.

  • insert 작업은 해당 연산으로 인해 업서트가 발생하는 경우 지정된 컬렉션에 대한 작업입니다.

기본 제공 역할 readWrite은 이러한 권한을 제공합니다.

updateMany()filter와 일치하는 컬렉션의 일치하는 모든 문서를 업데이트하고 update 기준을 사용하여 수정 사항을 적용합니다.

upsert: true이고 filter와 일치하는 문서가 없으면 db.collection.updateMany()filterupdate 매개 변수를 기반으로 새로운 문서를 생성합니다.

샤딩된 컬렉션에 upsert: true를 지정하는 경우 filter에 전체 샤드 키를 포함해야 합니다. 추가 db.collection.updateMany() 동작에 대해서는 샤딩된 컬렉션을 참조하세요.

업서트로 여러 문서 업데이트를 참조하세요.

수정 사양의 경우, db.collection.updateMany() 메서드는 수행할 업데이트 연산자 표현식만 포함하는 문서를 받을 수 있습니다.

예를 들면 다음과 같습니다.

db.collection.updateMany(
<query>,
{ $set: { status: "D" }, $inc: { quantity: 2 } },
...
)

db.collection.updateMany() 메서드는 수행할 수정 사항을 지정하는 집계 파이프라인 [ <stage1>, <stage2>, ... ]을(를) 허용할 수 있습니다. 파이프라인은 다음 단계로 구성될 수 있습니다.

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

예를 들면 다음과 같습니다.

db.collection.updateMany(
<query>,
[
{ $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } },
{ $unset: [ "misc1", "misc2" ] }
]
...
)

참고

이 파이프라인에서 $set$unset은 업데이트 연산자가 아닌 집계 단계입니다. 집계 단계에서는 $set$unset 문서에 새 필드를 추가하고 기존 필드 값을 수정하지 않습니다.

업데이트 연산자에 대한 자세한 내용은 $set$unset(을)를 참조하세요.

예시는 집계 파이프라인으로 업데이트를 참조하세요.

업데이트 작업이 문서 크기를 변경하는 경우, 작업은 실패합니다.

updateMany() 메서드는 MongoDB 5.1에서 시작하는 time series 컬렉션 에 사용할 수 있습니다.

upsert: true를 포함하고 샤드된 컬렉션에 있는 db.collection.updateMany() 작업의 경우 filter에 전체 샤드 키를 포함해야 합니다.

updateMany()db.collection.explain()과 호환되지 않습니다.

db.collection.updateMany()분산 트랜잭션 내에서 사용할 수 있습니다.

중요

대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.

추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.

트랜잭션이 교차 샤드 쓰기 트랜잭션인 아닌 경우 분산 트랜잭션 내에서 컬렉션과 인덱스를 생성할 수 있습니다.

upsert: truedb.collection.updateMany()는 기존 컬렉션이나 존재하지 않는 컬렉션에서 실행될 수 있습니다. 존재하지 않는 컬렉션에서 실행하면 작업이 컬렉션을 만듭니다.

다음도 참조하세요.

트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.

db.collection.updateMany() 작업이 문서를 한 개 이상 성공적으로 업데이트하는 경우 작업은 업데이트된 문서마다 oplog(작업 로그)에 항목을 추가합니다. 작업이 실패하거나 업데이트할 문서를 찾지 못하면 작업은 oplog에 항목을 추가하지 않습니다.

restaurant 컬렉션에는 다음 문서가 포함되어 있습니다.

{ "_id" : 1, "name" : "Central Perk Cafe", "violations" : 3 }
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "violations" : 2 }
{ "_id" : 3, "name" : "Empire State Sub", "violations" : 5 }
{ "_id" : 4, "name" : "Pizza Rat's Pizzaria", "violations" : 8 }

다음 작업은 violations이(가) 4보다 크고 검토 플래그가 $set인 모든 문서를 업데이트합니다.

try {
db.restaurant.updateMany(
{ violations: { $gt: 4 } },
{ $set: { "Review" : true } }
);
} catch (e) {
print(e);
}

이 연산은 다음을 반환합니다.

{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

이제 컬렉션에 다음 문서가 포함됩니다.

{ "_id" : 1, "name" : "Central Perk Cafe", "violations" : 3 }
{ "_id" : 2, "name" : "Rock A Feller Bar and Grill", "violations" : 2 }
{ "_id" : 3, "name" : "Empire State Sub", "violations" : 5, "Review" : true }
{ "_id" : 4, "name" : "Pizza Rat's Pizzaria", "violations" : 8, "Review" : true }

일치하는 항목이 없으면 작업은 대신 다음을 반환합니다.

{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }

upsert: true로 설정하면 일치하는 항목이 없는 경우 문서가 삽입됩니다.

db.collection.updateMany()는 업데이트에 집계 파이프라인을 사용할 수 있습니다. 파이프라인은 다음 단계로 구성될 수 있습니다.

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

다음 예에서는 Aggregation pipeline을 사용하여 문서의 다른 필드 값을 사용하여 필드를 수정합니다.

다음 문서로 students 컬렉션을 생성합니다.

db.students.insertMany( [
{ "_id" : 1, "student" : "Skye", "points" : 75, "commentsSemester1" : "great at math", "commentsSemester2" : "loses temper", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") },
{ "_id" : 2, "students" : "Elizabeth", "points" : 60, "commentsSemester1" : "well behaved", "commentsSemester2" : "needs improvement", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") }
] )

별도의 commentsSemester1commentsSemester2 필드 대신 이를 새 comments 필드에 수집한다고 가정합니다. 다음 업데이트 작업은 집계 파이프라인을 사용하여 다음을 수행합니다:

  • comments 필드를 추가하고 lastUpdate 필드를 설정합니다.

  • 컬렉션에 있는 모든 문서의 commentsSemester1commentsSemester2 필드를 삭제합니다.

db.students.updateMany(
{ },
[
{ $set: { comments: [ "$commentsSemester1", "$commentsSemester2" ], lastUpdate: "$$NOW" } },
{ $unset: [ "commentsSemester1", "commentsSemester2" ] }
]
)

참고

이 파이프라인에서 $set$unset은 업데이트 연산자가 아닌 집계 단계입니다. 집계 단계에서는 $set$unset 문서에 새 필드를 추가하고 기존 필드 값을 수정하지 않습니다.

업데이트 연산자에 대한 자세한 내용은 $set$unset(을)를 참조하세요.

첫 번째 단계

$set 단계:

  • 요소가 commentsSemester1commentsSemester2 필드의 현재 콘텐츠인 새 배열 필드 comments를 생성하고

  • 필드 lastUpdate를 집계 변수 NOW 값으로 설정합니다. 집계 변수 NOW는 현재 날짜/시간 값으로 해석되며 파이프라인 전체에서 동일하게 유지됩니다. 집계 변수에 액세스하려면 변수 앞에 이중 달러 기호 $$를 붙이고 따옴표로 묶습니다.

두 번째 단계
$unset 단계에서는 commentsSemester1commentsSemester2 필드를 제거합니다.

명령 후, 컬렉션에 다음과 같은 문서가 포함됩니다.

{ "_id" : 1, "student" : "Skye", "status" : "Modified", "points" : 75, "lastUpdate" : ISODate("2020-01-23T05:11:45.784Z"), "comments" : [ "great at math", "loses temper" ] }
{ "_id" : 2, "student" : "Elizabeth", "status" : "Modified", "points" : 60, "lastUpdate" : ISODate("2020-01-23T05:11:45.784Z"), "comments" : [ "well behaved", "needs improvement" ] }

Aggregation pipeline을 사용하면 업데이트에서 현재 필드 값을 기반으로 조건부 업데이트를 수행할 수 있을 뿐만 아니라 현재 필드 값을 사용하여 별도의 필드 값을 계산할 수도 있습니다.

예를 들어, 다음 문서를 사용하여 students3 컬렉션을 만듭니다.

db.students3.insertMany( [
{ "_id" : 1, "tests" : [ 95, 92, 90 ], "lastUpdate" : ISODate("2019-01-01T00:00:00Z") },
{ "_id" : 2, "tests" : [ 94, 88, 90 ], "lastUpdate" : ISODate("2019-01-01T00:00:00Z") },
{ "_id" : 3, "tests" : [ 70, 75, 82 ], "lastUpdate" : ISODate("2019-01-01T00:00:00Z") }
] )

Aggregation pipeline을 사용하여 계산된 등급 평균 및 문자 등급으로 문서를 업데이트할 수 있습니다.

db.students3.updateMany(
{ },
[
{ $set: { average : { $trunc: [ { $avg: "$tests" }, 0 ] } , lastUpdate: "$$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"
} } } }
]
)

참고

이 파이프라인에서 $set$unset은 업데이트 연산자가 아닌 집계 단계입니다. 집계 단계에서는 $set$unset 문서에 새 필드를 추가하고 기존 필드 값을 수정하지 않습니다.

업데이트 연산자에 대한 자세한 내용은 $set$unset(을)를 참조하세요.

첫 번째 단계

$set 단계:

  • tests 필드의 평균을 기준으로 새 필드 average 을 계산합니다. $avg 집계 연산자에 대한 자세한 내용은 $avg를 , $trunc 잘라내기 집계 연산자에 대한 자세한 내용은 $trunc을 참조하세요.

  • 필드 lastUpdate를 집계 변수 NOW 값으로 설정합니다. 집계 변수 NOW는 현재 날짜/시간 값으로 해석되며 파이프라인 전체에서 동일하게 유지됩니다. 집계 변수에 액세스하려면 변수 앞에 이중 달러 기호 $$를 붙이고 따옴표로 묶습니다.

두 번째 단계
$set 단계에서는 이전 단계에서 계산한 average 필드를 기반으로 새 필드 grade를 계산합니다. $switch 애그리게이션 연산자에 대한 자세한 내용은 $switch를 참조하세요.

명령 후, 컬렉션에 다음과 같은 문서가 포함됩니다.

{ "_id" : 1, "tests" : [ 95, 92, 90 ], "lastUpdate" : ISODate("2020-01-24T17:31:01.670Z"), "average" : 92, "grade" : "A" }
{ "_id" : 2, "tests" : [ 94, 88, 90 ], "lastUpdate" : ISODate("2020-01-24T17:31:01.670Z"), "average" : 90, "grade" : "A" }
{ "_id" : 3, "tests" : [ 70, 75, 82 ], "lastUpdate" : ISODate("2020-01-24T17:31:01.670Z"), "average" : 75, "grade" : "C" }

inspectors 컬렉션에는 다음 문서가 포함되어 있습니다.

{ "_id" : 92412, "inspector" : "F. Drebin", "Sector" : 1, "Patrolling" : true },
{ "_id" : 92413, "inspector" : "J. Clouseau", "Sector" : 2, "Patrolling" : false },
{ "_id" : 92414, "inspector" : "J. Clouseau", "Sector" : 3, "Patrolling" : true },
{ "_id" : 92415, "inspector" : "R. Coltrane", "Sector" : 3, "Patrolling" : false }

다음 작업은 Sector가 4보다 크고 inspector"R. Coltrane"와 동일한 모든 문서를 업데이트합니다.

try {
db.inspectors.updateMany(
{ "Sector" : { $gt : 4 }, "inspector" : "R. Coltrane" },
{ $set: { "Patrolling" : false } },
{ upsert: true }
);
} catch (e) {
print(e);
}

이 연산은 다음을 반환합니다.

{
"acknowledged" : true,
"matchedCount" : 0,
"modifiedCount" : 0,
"upsertedId" : ObjectId("56fc5dcb39ee682bdc609b02"),
"upsertedCount": 1
}

이제 컬렉션에 다음 문서가 포함됩니다.

{ "_id" : 92412, "inspector" : "F. Drebin", "Sector" : 1, "Patrolling" : true },
{ "_id" : 92413, "inspector" : "J. Clouseau", "Sector" : 2, "Patrolling" : false },
{ "_id" : 92414, "inspector" : "J. Clouseau", "Sector" : 3, "Patrolling" : true },
{ "_id" : 92415, "inspector" : "R. Coltrane", "Sector" : 3, "Patrolling" : false },
{ "_id" : ObjectId("56fc5dcb39ee682bdc609b02"), "inspector" : "R. Coltrane", "Patrolling" : false }

필터와 일치하는 문서가 없고 upserttrue이므로 updateMany()는 생성된 _id, filter의 동등 조건, update 수정자를 사용하여 문서를 삽입했습니다.

3명으로 구성된 멤버 복제본 세트가 있는 경우 다음 작업은 majorityw100wtimeout을 지정합니다.

try {
db.restaurant.updateMany(
{ "name" : "Pizza Rat's Pizzaria" },
{ $inc: { "violations" : 3}, $set: { "Closed" : true } },
{ w: "majority", wtimeout: 100 }
);
} catch (e) {
print(e);
}

확인이 wtimeout 제한보다 오래 걸리면 다음 예외가 발생합니다.

WriteConcernError({
"code" : 64,
"errmsg" : "waiting for replication timed out",
"errInfo" : {
"wtimeout" : true,
"writeConcern" : {
"w" : "majority",
"wtimeout" : 100,
"provenance" : "getLastErrorDefaults"
}
}
})

다음 표에서는 errInfo.writeConcern.provenance의 가능한 값에 대해 설명합니다.

출처
설명
clientSupplied
쓰기 우려 사항은 애플리케이션에서 지정되었습니다.
customDefault
쓰기 고려는 사용자 정의된 기본값에서 비롯된 것입니다. setDefaultRWConcern을 참조하십시오.
getLastErrorDefaults
쓰기 고려는 복제본 세트의 settings.getLastErrorDefaults 필드에서 발생했습니다.
implicitDefault
쓰기 고려는 다른 모든 쓰기 고려 사양이 없는 상태에서 서버에서 발생했습니다.

버전 3.4에 새로 추가되었습니다.

데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.

컬렉션 myColl에는 다음 문서가 있습니다.

{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

다음 작업에는 데이터 정렬 옵션이 포함됩니다.

db.myColl.updateMany(
{ category: "cafe" },
{ $set: { status: "Updated" } },
{ collation: { locale: "fr", strength: 1 } }
);

배열 필드를 업데이트할 때 업데이트할 배열 요소를 결정하는 arrayFilters 를 지정할 수 있습니다.

다음 문서를 사용하여 컬렉션 students를 생성합니다.

db.students.insertMany( [
{ "_id" : 1, "grades" : [ 95, 92, 90 ] },
{ "_id" : 2, "grades" : [ 98, 100, 102 ] },
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
] )

grades 배열에서 100 이상인 모든 요소를 업데이트하려면 필터링된 위치 연산자 $[<identifier>]arrayFilters 옵션과 함께 사용하십시오.

db.students.updateMany(
{ grades: { $gte: 100 } },
{ $set: { "grades.$[element]" : 100 } },
{ arrayFilters: [ { "element": { $gte: 100 } } ] }
)

작업 후 컬렉션에는 다음 문서가 포함됩니다.

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] }
{ "_id" : 3, "grades" : [ 95, 100, 100 ] }

다음 문서를 사용하여 컬렉션 students2를 생성합니다.

db.students2.insertMany( [
{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 6 },
{ "grade" : 85, "mean" : 90, "std" : 4 },
{ "grade" : 85, "mean" : 85, "std" : 6 }
]
},
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 75, "std" : 6 },
{ "grade" : 87, "mean" : 90, "std" : 3 },
{ "grade" : 85, "mean" : 85, "std" : 4 }
]
}
] )

등급이 85 이상인 grades 배열의 모든 요소에 대한 mean 필드 값을 수정하려면 필터링된 위치 연산자 $[<identifier>]을(를) arrayFilters와(과) 함께 사용합니다.

db.students2.updateMany(
{ },
{ $set: { "grades.$[elem].mean" : 100 } },
{ arrayFilters: [ { "elem.grade": { $gte: 85 } } ] }
)

작업 후 컬렉션에는 다음 문서가 포함됩니다.

{
"_id" : 1,
"grades" : [
{ "grade" : 80, "mean" : 75, "std" : 6 },
{ "grade" : 85, "mean" : 100, "std" : 4 },
{ "grade" : 85, "mean" : 100, "std" : 6 }
]
}
{
"_id" : 2,
"grades" : [
{ "grade" : 90, "mean" : 100, "std" : 6 },
{ "grade" : 87, "mean" : 100, "std" : 3 },
{ "grade" : 85, "mean" : 100, "std" : 4 }
]
}

다음 문서로 샘플 students 컬렉션을 생성합니다.

db.students.insertMany( [
{ "_id" : 1, "student" : "Richard", "grade" : "F", "points" : 0, "comments1" : null, "comments2" : null },
{ "_id" : 2, "student" : "Jane", "grade" : "A", "points" : 60, "comments1" : "well behaved", "comments2" : "fantastic student" },
{ "_id" : 3, "student" : "Ronan", "grade" : "F", "points" : 0, "comments1" : null, "comments2" : null },
{ "_id" : 4, "student" : "Noah", "grade" : "D", "points" : 20, "comments1" : "needs improvement", "comments2" : null },
{ "_id" : 5, "student" : "Adam", "grade" : "F", "points" : 0, "comments1" : null, "comments2" : null },
{ "_id" : 6, "student" : "Henry", "grade" : "A", "points" : 86, "comments1" : "fantastic student", "comments2" : "well behaved" }
] )

컬렉션에 다음 인덱스를 만듭니다.

db.students.createIndex( { grade: 1 } )

다음 업데이트 작업은 인덱스 { grade: 1 }을(를) 사용하도록 명시적으로 암시합니다.

참고

존재하지 않는 인덱스를 지정하면 연산 오류가 발생합니다.

db.students.updateMany(
{ "points": { $lte: 20 }, "grade": "F" },
{ $set: { "comments1": "failed class" } },
{ hint: { grade: 1 } }
)

업데이트 명령은 다음을 반환합니다.

{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

힌트 인덱스가 사용되는지 확인하려면 $indexStats 파이프라인을 실행하세요.

db.students.aggregate( [ { $indexStats: { } }, { $sort: { name: 1 } }, { $match: {key: { grade: 1 } } } ] )

돌아가기

db.collection.updateOne()

다음

db.collection.watch()