db.collection.updateOne()
드라이버가 포함된 MongoDB
이 페이지에서는 mongosh
메서드를 설명합니다. MongoDB 드라이버에서 해당 메서드를 보려면 프로그래밍 언어의 해당 페이지를 참조하세요.
정의
호환성
다음 환경에서 호스팅되는 배포에 db.collection.updateOne()
사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
updateOne()
메서드의 구문은 다음과 같습니다.
db.collection.updateOne( <filter>, <update>, { upsert: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string>, let: <document>, sort: <document> } )
매개변수
db.collection.updateOne()
메서드는 다음 매개변수를 사용합니다.
Parameter | 유형 | 설명 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
문서 | ||||||||||||||||||||
문서 또는 파이프라인 | 수정 사항을 적용합니다. 다음 중 하나일 수 있습니다.
대체 문서로 업데이트하려면 | |||||||||||||||||||
upsert | 부울 | 선택 사항입니다.
여러 개의 업서트를 방지하려면 기본값은 | ||||||||||||||||||
writeConcern | 문서 | 선택 사항입니다. 쓰기 고려를 표현하는 문서입니다. 기본 쓰기 고려를 사용하지 않으려면 생략하세요. 트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요. | ||||||||||||||||||
collation | 문서 | 선택 사항. 작업에 사용할 데이터 정렬을 지정합니다. 데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다. 데이터 정렬 옵션의 구문은 다음과 같습니다:
데이터 정렬을 지정할 때 데이터 정렬이 지정되지 않았지만 컬렉션에 기본 데이터 정렬이 있는 경우( 컬렉션 또는 연산에 대한 데이터 정렬이 지정되지 않은 경우, MongoDB는 이전 버전에서 문자열 비교에 사용된 간단한 이진 비교를 사용합니다. 한 연산에 대해 여러 데이터 정렬을 지정할 수 없습니다. 예를 들어 필드별로 서로 다른 데이터 정렬을 지정할 수 없으며 정렬과 함께 찾기를 수행하는 경우 찾기 와 정렬에서 각각 다른 데이터 정렬을 사용하는 것은 허용되지 않습니다. | ||||||||||||||||||
arrayFilters | 배열 | 선택 사항입니다. 필터 문서의 배열로, 배열 필드에 대한 업데이트 작업을 위해 수정할 배열 요소를 결정합니다. 업데이트 문서에서
업데이트 문서에 동일한 식별자를 여러 번 포함할 수 있지만, 업데이트 문서의 각 고유 식별자(
그러나 다음 예시와 같이 단일 필터 문서에서 동일한 식별자에 복합 조건을 지정할 수 있습니다.
예시는 배열 업데이트 연산에 | ||||||||||||||||||
문서 또는 문자열 | 선택 사항입니다. 쿼리 조건자를 지원하는 데 사용할 인덱스를 지정하는 문서 또는 문자열입니다. 이 옵션은 인덱스 사양 문서 또는 인덱스 이름 문자열을 사용할 수 있습니다. 존재하지 않는 인덱스를 지정하면 연산 오류가 발생합니다. 예시를 보려면 업데이트 작업에 대해 | |||||||||||||||||||
let | 문서 | 선택 사항. 변수 목록이 있는 문서를 지정합니다. 이를 통해 쿼리 텍스트에서 변수를 분리하여 명령 가독성을 향상시킬 수 있습니다. 문서 구문은 다음과 같습니다:
변수는 표현식에서 반환된 값으로 설정되며 이후에는 변경할 수 없습니다. 명령에서 변수 값에 액세스하려면 변수를 사용하여 결과를 필터링하려면
| ||||||||||||||||||
sort | 문서 | 선택 사항. 쿼리가 여러 문서를 선택하는 경우 연산이 업데이트할 문서를 결정합니다. 정렬 인수가 문서가 아닌 경우 작업 오류가 발생합니다. MongoDB는 특정 순서에 따라 문서를 컬렉션에 저장하지 않습니다. 중복 값이 포함된 필드를 정렬할 때 해당 값이 포함된 문서는 임의의 순서로 반환될 수 있습니다. 일관적인 정렬 순서가 필요한 경우 고유값이 포함된 필드를 정렬에 하나 이상 포함하세요. 이를 보장하는 가장 쉬운 방법은 정렬 쿼리에 자세한 내용은 Sort Consistency(정렬 일관성)을(를) 참조하세요. 버전 8.0에 추가 되었습니다. |
반환
이 메서드는 다음을 포함하는 문서를 반환합니다.
matchedCount
- 매칭된 문서의 수를 포함modifiedCount
- 수정된 문서 수를 포함upsertedId
upserted 문서의_id
이(가) 포함된 [upsertedId]upsertedCount
업서트된 문서 수를 포함하는쓰기 고려로 작업이 실행된 경우 부울
acknowledged
을true
로, 쓰기 고려가 비활성화된 경우 부울을false
로 설정합니다.
액세스 제어
authorization
으로 실행되는 배포에서 사용자에게 다음 권한이 포함된 액세스 권한이 있어야 합니다.
update
지정된 컬렉션에 대한 조치입니다.find
지정된 컬렉션에 대한 조치입니다.insert
작업은 해당 연산으로 인해 업서트가 발생하는 경우 지정된 컬렉션에 대한 작업입니다.
기본 제공 역할 readWrite
은 이러한 권한을 제공합니다.
행동
단일 문서 업데이트
db.collection.updateOne()
은 필터 와 일치하는 첫 번째 문서를 찾아 지정된 업데이트 수정 사항을 적용합니다.
업데이트 연산자 표현식 문서가 포함된 업데이트
업데이트 사양의 경우 db.collection.updateOne()
메서드는 업데이트 연산자 표현식만 포함된 문서를 허용할 수 있습니다.
예를 들면 다음과 같습니다.
db.collection.updateOne( <query>, { $set: { status: "D" }, $inc: { quantity: 2 } }, ... )
집계 파이프라인으로 업데이트하기
db.collection.updateOne()
메서드는 수행할 수정 사항을 지정하는 집계 파이프라인 [ <stage1>, <stage2>, ... ]
을(를) 허용할 수 있습니다. 파이프라인은 다음 단계로 구성될 수 있습니다.
$addFields
및 그 별칭$set
$replaceRoot
및 별칭$replaceWith
입니다.
집계 파이프라인e을 사용하면 현재 필드 값을 기반으로 조건부 업데이트를 표현하거나 다른 필드의 값을 사용하여 한 필드를 업데이트하는 등 보다 표현력이 풍부한 업데이트 구문을 작성할 수 있습니다.
예를 들면 다음과 같습니다.
db.collection.updateOne( <query>, [ { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } }, { $unset: [ "misc1", "misc2" ] } ] ... )
예시는 집계 파이프라인으로 업데이트를 참조하세요.
업서트
MongoDB 부터는 7.1
upsert: true
샤딩된 컬렉션 에 를 지정하면 필터하다 에 전체 샤드 키 를 포함할 필요 가 없습니다 .upsert: true
이고filter
와 일치하는 문서가 없는 경우db.collection.updateOne()
은filter
기준 및update
수정 사항을 기반으로 새 문서를 생성합니다. 업서트로 업데이트를 참조하세요.샤드된 컬렉션에 대한 추가
db.collection.updateOne()
동작은 샤딩된 된 컬렉션 을 참조하세요 .
고정 사이즈 컬렉션
업데이트 작업이 문서 크기를 변경하는 경우, 작업은 실패합니다.
샤드 컬렉션
upsert
샤드 컬렉션에서
샤딩된 컬렉션에서 db.collection.updateOne()
을 사용하려면 다음을 수행합니다.
MongoDB 부터는 7.1
upsert: true
샤딩된 컬렉션 에 를 지정하면 필터하다 에 전체 샤드 키 를 포함할 필요 가 없습니다 .upsert: true
를 지정하지 않으면_id
필드에 정확히 일치하는 항목을 포함하거나 단일 샤드를 대상으로 지정해야 합니다(예: 필터에 샤드 키를 포함하는 방식).
그러나 샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. 샤드 키가 누락된 문서를 대상으로 하려면 null
동등성 매치를 다른 필터 조건(예: _id
필드)과 함께 사용할 수 있습니다. 예를 들면 다음과 같습니다.
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
샤드 키 수정
샤드 키 필드가 변경할 수 없는 _id
필드가 아닌 경우 문서의 샤드 키 값을 업데이트할 수 있습니다.
경고
샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. 문서의 샤드 키 값을 변경할 때 실수로 샤드 키를 제거하지 않도록 주의해야 합니다.
기존 샤드 키 값을 db.collection.updateOne()
으로 수정하려면 다음을 수행합니다.
샤딩된 컬렉션에서 upsert
도 참조하세요.
누락된 샤드 키
버전 7.1부터는 쿼리 사양에서 샤드 키나
_id
필드를 제공할 필요가 없습니다.샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락 될 수 있습니다.
db.collection.updateOne()
을 사용하여 누락된 샤드 키를 설정하려면 반드시mongos
에서 실행해야 합니다. 샤드에서 바로 연산을 실행하지 마세요.또한 다음 요구 사항도 적용됩니다.
작업요구 사항:설정 방법null
upsert: true
인 경우 전체 샤드 키에 대한 동일성 필터가 필요합니다.null
이 아닌 값으로 설정하려면 다음 단계를 따르세요.팁
누락된 키 값은 null 동등성 매치의 일부로 반환되므로 null 값 키가 업데이트되지 않도록 하려면 추가 쿼리 조건(예:
_id
필드)을 적절히 포함하세요.
다음도 참조하세요.
설명 가능성
updateOne()
는 db.collection.explain()
과 호환되지 않습니다.
트랜잭션
db.collection.updateOne()
는 분산 트랜잭션 내에서 사용할 수 있습니다.
중요
대부분의 경우 분산 트랜잭션은 단일 문서 쓰기에 비해 더 큰 성능 비용이 발생하므로 분산 트랜잭션의 가용성이 효과적인 스키마 설계를 대체할 수는 없습니다. 대부분의 시나리오에서 비정규화된 데이터 모델 (내장된 문서 및 배열) 은 계속해서 데이터 및 사용 사례에 최적일 것입니다. 즉, 대부분의 시나리오에서 데이터를 적절하게 모델링하면 분산 트랜잭션의 필요성이 최소화됩니다.
추가 트랜잭션 사용 고려 사항(예: 런타임 제한 및 oplog 크기 제한)은 프로덕션 고려사항을 참조하세요.
트랜잭션 내 업서트
트랜잭션이 교차 샤드 쓰기 트랜잭션(write transaction)이 아닌 경우 분산 트랜잭션 내에서 컬렉션과 인덱스를 생성할 수 있습니다.
upsert: true
인 db.collection.updateOne()
는 기존 컬렉션이나 존재하지 않는 컬렉션에서 실행될 수 있습니다. 존재하지 않는 컬렉션에서 실행하면 작업이 컬렉션을 만듭니다.
쓰기 고려 및 트랜잭션
트랜잭션에서 실행되는 경우 작업에 대한 쓰기 고려를 명시적으로 설정하지 마세요. 트랜잭션에 쓰기 고려를 사용하려면 트랜잭션 및 쓰기 고려를 참조하세요.
oplog 항목
db.collection.updateOne()
작업이 문서를 성공적으로 업데이트하면 이 작업은 oplog(작업 로그)에 항목을 추가합니다. 작업이 실패하거나 업데이트할 문서를 찾지 못하면 작업은 oplog에 항목을 추가하지 않습니다.
예시
업데이트 연산자 표현식을 사용하여 업데이트
restaurant
컬렉션에는 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "name" : "Central Perk Cafe", "Borough" : "Manhattan" }, { "_id" : 2, "name" : "Rock A Feller Bar and Grill", "Borough" : "Queens", "violations" : 2 }, { "_id" : 3, "name" : "Empire State Pub", "Borough" : "Brooklyn", "violations" : 0 }
다음 작업은 name: "Central Perk Cafe"
이 violations
필드가 있는 단일 문서를 업데이트합니다.
try { db.restaurant.updateOne( { "name" : "Central Perk Cafe" }, { $set: { "violations" : 3 } } ); } catch (e) { print(e); }
이 연산은 다음을 반환합니다.
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
일치하는 항목이 없으면 작업은 대신 다음을 반환합니다.
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }
upsert: true
를 설정하면 일치하는 항목이 없는 경우 문서가 삽입됩니다. 업서트로 업데이트를 참조하세요.
집계 파이프라인으로 업데이트하기
db.collection.updateOne()
는 업데이트에 집계 파이프라인을 사용할 수 있습니다. 파이프라인은 다음 단계로 구성될 수 있습니다.
$addFields
및 그 별칭$set
$replaceRoot
및 별칭$replaceWith
입니다.
집계 파이프라인e을 사용하면 현재 필드 값을 기반으로 조건부 업데이트를 표현하거나 다른 필드의 값을 사용하여 한 필드를 업데이트하는 등 보다 표현력이 풍부한 업데이트 구문을 작성할 수 있습니다.
예시 1
다음 예에서는 집계 파이프라인e을 사용하여 문서의 다른 필드 값을 사용하여 필드를 수정합니다.
다음 문서로 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, "student" : "Elizabeth", "points" : 60, "commentsSemester1" : "well behaved", "commentsSemester2" : "needs improvement", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") } ] )
첫 번째 문서에서 commentsSemester1
필드와 commentsSemester2
필드를 구분하는 대신 두 번째 문서처럼 comments
필드로 모으고 싶다고 가정해 보겠습니다. 다음 업데이트 작업은 집계 파이프라인을 사용하여 다음을 수행합니다.
새
comments
필드를 추가하고lastUpdate
필드를 설정합니다.컬렉션에 있는 모든 문서의
commentsSemester1
및commentsSemester2
필드를 삭제합니다.
업데이트 명령의 필터가 고유한 문서를 대상으로 하는지 확인하십시오. 아래 코드에 id
필드는 이러한 필터의 예입니다.
db.students.updateOne( { _id: 1 }, [ { $set: { status: "Modified", comments: [ "$commentsSemester1", "$commentsSemester2" ], lastUpdate: "$$NOW" } }, { $unset: [ "commentsSemester1", "commentsSemester2" ] } ] )
명령 후, 컬렉션에 다음과 같은 문서가 포함됩니다.
{ "_id" : 2, "student" : "Elizabeth", "status" : "Modified", "points" : 60, "lastUpdate" : ISODate("2020-01-23T05:11:45.784Z"), "comments" : [ "well behaved", "needs improvement" ] } { _id: 1, student: 'Skye', points: 75, commentsSemester1: 'great at math', commentsSemester2: 'loses temper', lastUpdate: ISODate("2019-01-01T00:00:00.000Z") }
정렬을 도입한 후에는 정렬 순서에서 발견된 첫 번째 문서만 수정되고 나머지 문서는 그대로 유지됩니다.
예시 2
집계 파이프라인e을 사용하면 업데이트에서 현재 필드 값을 기반으로 조건부 업데이트를 수행할 수 있을 뿐만 아니라 현재 필드 값을 사용하여 별도의 필드 값을 계산할 수도 있습니다.
예를 들어, 다음 문서를 사용하여 students3
컬렉션을 만듭니다.
db.students3.insertMany( [ { "_id" : 1, "tests" : [ 95, 92, 90 ], "average" : 92, "grade" : "A", "lastUpdate" : ISODate("2020-01-23T05:18:40.013Z") }, { "_id" : 2, "tests" : [ 94, 88, 90 ], "average" : 91, "grade" : "A", "lastUpdate" : ISODate("2020-01-23T05:18:40.013Z") }, { "_id" : 3, "tests" : [ 70, 75, 82 ], "lastUpdate" : ISODate("2019-01-01T00:00:00Z") } ] )
세 번째 문서 _id: 3
에 average
및 grade
필드가 누락되었습니다. 집계 파이프라인을 사용하여 계산된 등급 평균 및 문자 등급으로 문서를 업데이트할 수 있습니다.
db.students3.updateOne( { _id: 3 }, [ { $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
는 업데이트 연산자 $set
가 아닌 집계 단계 $set
를 참조합니다.
- 첫 번째 단계
$set
단계:- 두 번째 단계
$set
단계에서는 이전 단계에서 계산한average
필드를 기반으로 새 필드grade
를 계산합니다.$switch
집계 연산자에 대한 자세한 내용은$switch
를 참조하세요.
명령 후, 컬렉션에 다음과 같은 문서가 포함됩니다.
{ "_id" : 1, "tests" : [ 95, 92, 90 ], "average" : 92, "grade" : "A", "lastUpdate" : ISODate("2020-01-23T05:18:40.013Z") } { "_id" : 2, "tests" : [ 94, 88, 90 ], "average" : 91, "grade" : "A", "lastUpdate" : ISODate("2020-01-23T05:18:40.013Z") } { "_id" : 3, "tests" : [ 70, 75, 82 ], "lastUpdate" : ISODate("2020-01-24T17:33:30.674Z"), "average" : 75, "grade" : "C" }
업서트로 업데이트
restaurant
컬렉션에는 다음 문서가 포함되어 있습니다.
{ "_id" : 1, "name" : "Central Perk Cafe", "Borough" : "Manhattan", "violations" : 3 }, { "_id" : 2, "name" : "Rock A Feller Bar and Grill", "Borough" : "Queens", "violations" : 2 }, { "_id" : 3, "name" : "Empire State Pub", "Borough" : "Brooklyn", "violations" : "0" }
다음 연산은 name : "Pizza Rat's Pizzaria"
인 문서를 upsert: true
로 바꾸려고 시도합니다.
try { db.restaurant.updateOne( { "name" : "Pizza Rat's Pizzaria" }, { $set: {"_id" : 4, "violations" : 7, "borough" : "Manhattan" } }, { upsert: true } ); } catch (e) { print(e); }
upsert:true
이후 문서는 filter
및 update
기준에 따라 inserted
입니다. 이 연산은 다음을 반환합니다.
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : 4, "upsertedCount": 1 }
이제 컬렉션에 다음 문서가 포함됩니다.
{ "_id" : 1, "name" : "Central Perk Cafe", "Borough" : "Manhattan", "violations" : 3 }, { "_id" : 2, "name" : "Rock A Feller Bar and Grill", "Borough" : "Queens", "violations" : 2 }, { "_id" : 3, "name" : "Empire State Pub", "Borough" : "Brooklyn", "violations" : 4 }, { "_id" : 4, "name" : "Pizza Rat's Pizzaria", "Borough" : "Manhattan", "violations" : 7 }
name
필드는 filter
기준을 사용하여 채워졌으며 update
연산자는 문서의 나머지 부분을 만드는 데 사용되었습니다.
다음 작업은 10
보다 큰 violations
로 첫 번째 문서를 업데이트합니다.
try { db.restaurant.updateOne( { "violations" : { $gt: 10} }, { $set: { "Closed" : true } }, { upsert: true } ); } catch (e) { print(e); }
이 연산은 다음을 반환합니다.
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("56310c3c0c5cbb6031cafaea") }
이제 컬렉션에 다음 문서가 포함됩니다.
{ "_id" : 1, "name" : "Central Perk Cafe", "Borough" : "Manhattan", "violations" : 3 }, { "_id" : 2, "name" : "Rock A Feller Bar and Grill", "Borough" : "Queens", "violations" : 2 }, { "_id" : 3, "name" : "Empire State Pub", "Borough" : "Brooklyn", "violations" : 4 }, { "_id" : 4, "name" : "Pizza Rat's Pizzaria", "Borough" : "Manhattan", "grade" : 7 } { "_id" : ObjectId("56310c3c0c5cbb6031cafaea"), "Closed" : true }
필터와 일치하는 문서가 없고 upsert
가 true
이므로 updateOne()
이 생성된 _id
와 update
만 기준으로 해 문서를 삽입했습니다.
쓰기 고려로 업데이트
3명으로 구성된 멤버 복제본 세트가 있는 경우 다음 작업은 majority
의 w
및 100
의 wtimeout
을 지정합니다.
try { db.restaurant.updateOne( { "name" : "Pizza Rat's Pizzaria" }, { $inc: { "violations" : 3}, $set: { "Closed" : true } }, { w: "majority", wtimeout: 100 } ); } catch (e) { print(e); }
기본 및 하나 이상의 보조 서버가 100밀리초 이내에 각 쓰기 작업을 확인하면 다음을 반환합니다.
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
승인이 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 | 쓰기 고려는 다른 모든 쓰기 고려 사양이 없는 상태에서
서버에서 발생했습니다. |
정렬로 업데이트
버전 8.0에 추가 되었습니다.
다음 예시에서는 평가가 가장 낮은 활성 사용자를 비활성화합니다.
db.people.updateOne( { state: "active" }, { $set: { state: "inactive" } }, { sort: { rating: 1 } )
데이터 정렬 지정
데이터 정렬을 사용하면 대소문자 및 악센트 표시 규칙과 같은 문자열 비교에 대한 언어별 규칙을 지정할 수 있습니다.
컬렉션 myColl
에는 다음 문서가 있습니다.
{ _id: 1, category: "café", status: "A" } { _id: 2, category: "cafe", status: "a" } { _id: 3, category: "cafE", status: "a" }
다음 작업에는 데이터 정렬 옵션이 포함됩니다.
db.myColl.updateOne( { category: "cafe" }, { $set: { status: "Updated" } }, { collation: { locale: "fr", strength: 1 } } );
arrayFilters
배열 업데이트 작업에 지정
배열 필드를 업데이트할 때 업데이트할 배열 요소를 결정하는 arrayFilters
를 지정할 수 있습니다.
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
보다 크거나 같은 모든 요소를 수정하려면 db.collection.updateOne()
메서드의 arrayFilters
옵션과 함께 필터링된 위치 연산자 $[<identifier>]
를 사용합니다.
db.students.updateOne( { grades: { $gte: 100 } }, { $set: { "grades.$[element]" : 100 } }, { arrayFilters: [ { "element": { $gte: 100 } } ] } )
작업은 단일 문서의 grades
필드를 업데이트하며, 작업 후 컬렉션에는 다음과 같은 문서가 포함됩니다.
{ "_id" : 1, "grades" : [ 95, 92, 90 ] } { "_id" : 2, "grades" : [ 98, 100, 100 ] } { "_id" : 3, "grades" : [ 95, 110, 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.collection.updateOne()
메서드를 사용합니다.
db.students2.updateOne( { }, { $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" : 75, "std" : 6 }, { "grade" : 87, "mean" : 90, "std" : 3 }, { "grade" : 85, "mean" : 85, "std" : 4 } ] }
업데이트 hint
작업에 지정
다음 문서로 샘플 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 } ) db.students.createIndex( { points: 1 } )
다음 업데이트 작업은 인덱스 {
grade: 1 }
을(를) 사용하도록 명시적으로 암시합니다.
참고
존재하지 않는 인덱스를 지정하면 연산 오류가 발생합니다.
db.students.updateOne( { "points": { $lte: 20 }, "grade": "F" }, { $set: { "comments1": "failed class" } }, { hint: { grade: 1 } } )
업데이트 명령은 다음을 반환합니다.
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
참고
3개의 문서가 업데이트 기준과 일치하더라도 updateOne
는 찾은 첫 번째 문서만 수정합니다. 따라서 학생 Richard, Ronan 및 Adam이 모두 기준을 충족하더라도 Richard만 업데이트됩니다.
사용된 인덱스를 보려면 작업에 대해 explain
을 실행하세요.
db.students.explain().update( { "points": { $lte: 20 }, "grade": "F" }, { $set: { "comments1": "failed class" } }, { multi: true, hint: { grade: 1 } } )
사용자 역할 및 문서 업데이트
MongoDB 7.0부터는 새로운 USER_ROLES
시스템 변수를 사용하여 사용자 역할을 반환할 수 있습니다.
이 섹션의 예시에서는 의료 정보가 포함된 컬렉션의 필드에 대한 업데이트를 보여줍니다. 이 예시에서는 USER_ROLES
시스템 변수로부터 현재 사용자 역할을 읽고, 사용자에게 특정 역할이 있는 경우에만 업데이트를 실행합니다.
시스템 변수를 사용하려면 변수 이름 시작 부분에 $$
를 추가합니다. USER_ROLES
시스템 변수를 $$USER_ROLES
로 지정합니다.
이 예시에서는 다음과 같은 사용자를 생성합니다.
James
Billing
역할이 있습니다.Michelle
Provider
역할이 있습니다.
역할, 사용자 및 컬렉션을 생성하려면 다음 단계를 수행하세요.
역할 생성
필수 권한 및 리소스로 이름이 Billing
인 역할과 Provider
인 역할을 생성하세요.
실행:
db.createRole( { role: "Billing", privileges: [ { resource: { db: "test", collection: "medicalView" }, actions: [ "find" ] } ], roles: [ ] } ) db.createRole( { role: "Provider", privileges: [ { resource: { db: "test", collection: "medicalView" }, actions: [ "find" ] } ], roles: [ ] } )
Provider
역할이 있는 Michelle
(으)로 로그인하여 다음과 같이 업데이트를 실행하세요.
이전 예시에서는 $setIntersection
을(를) 사용하여 "Provider"
문자열과 $$USER_ROLES.role
소속 사용자 역할 사이의 교차점이 비어 있지 않은 문서를 반환합니다. Michelle
에게 Provider
역할이 있으므로 업데이트가 실행되었습니다.
이어서 Provider
역할이 없는 James
(으)로 로그인하고 동일한 업데이트를 실행해 보세요.
이전 예시에서는 어떤 문서도 업데이트하지 않습니다.