Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

db.collection.update()

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • 액세스 제어
  • 행동
  • 예시
  • WriteResult

중요

더 이상 사용되지 않는 mongosh 메서드

이 메서드는 mongosh에서 더 이상 사용되지 않습니다. 대체 메서드는 레거시 mongo shell과의 호환성 변경 사항을 참조하세요.

db.collection.update(query, update, options)

컬렉션에 있는 기존 문서를 수정합니다. 이 메서드는 업데이트 매개변수에 따라 기존 문서의 특정 필드를 수정하거나 기존 문서를 완전히 대체할 수 있습니다.

기본적으로 db.collection.update() 메서드는 단일 문서를 업데이트합니다. 쿼리 기준과 일치하는 모든 문서를 업데이트하려면 multi: true 옵션을 포함하세요.

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

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

  • MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전

  • MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전

Atlas UI를 사용하여 MongoDB Atlas에서 호스팅되는 문서를 업데이트하는 방법을 알아보려면 문서 하나 편집하기를 참조하세요.

버전 5.0에서 변경됨

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

db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>,
let: <document> // Added in MongoDB 5.0
}
)

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

Parameter
유형
설명
문서

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

upsert: trueupdate()를 실행할 때 쿼리와 일치하는 기존 문서가 없는 경우, 쿼리가 점 표기법을 사용하여 _id 필드에 조건을 지정하면 MongoDB는 새 문서 삽입을 거부합니다.

문서 또는 파이프라인

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

<field1>: <value1> 0}쌍만 포함합니다.

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

자세한 내용과 예시는 oplog 항목에서 확인하세요.

부울

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

  • query와 일치하는 문서가 없는 경우 새 문서를 만듭니다. 자세한 내용은 업서트 동작을 참조하세요.

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

upsertmulti가 모두 참이고 쿼리와 일치하는 문서가 없으면 업데이트 작업은 단일 문서만 삽입합니다.

업서트가 여러 번 발생하지 않도록 하려면 query 필드를 고유하게 인덱싱해야 합니다. 예시를 보려면 중복 값이 있는 업서트를 참조하세요.

기본값은 false이며, 일치하는 문서를 찾을 수 없을 때 새 문서를 삽입하지 않습니다.

부울

선택 사항입니다. true로 설정하면 query 기준을 충족하는 여러 문서를 업데이트합니다. false로 설정하면 문서 하나를 업데이트합니다. 기본값은 false입니다. 자세한 내용은 여러 문서 업데이트 예시를 참조하세요.

문서

선택 사항입니다. 쓰기 우려를 표현하는 문서입니다. 기본값 쓰기 고려를 사용하려면 w: "majority" 생략합니다.

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

0}을 사용하는 예는 writeConcern 기본 쓰기 우려 사항 재정의하기를 참조하세요.

문서

선택 사항.

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

0}을 사용하는 예는 collation 데이터 정렬 지정을 참조하십시오.

배열

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

업데이트 문서에서 $[<identifier>]를 사용하여 arrayFilters의 해당 필터 문서와 일치하는 배열 요소만 업데이트하는 식별자를 정의합니다.

참고

식별자가 업데이트 문서에 포함되어 있지 않으면 식별자에 대한 배열 필터 문서를 사용할 수 없습니다.

예는 배열 업데이트 작업에 arrayFilters 지정을 참조하세요.

문서 또는 문자열

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

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

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

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

문서

선택 사항.

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

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

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

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

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

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

let 및 변수를 사용한 전체 예시는 let에서 변수 사용을 참조하세요.

버전 5.0에 추가.

이 메서드는 작업 상태가 포함된 WriteResult 문서를 반환합니다.

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

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

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

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

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

$expr 연산자를 사용하려고 하면 업서트 플래그가 true로 설정된 상태에서 오류가 발생합니다.

샤딩된 컬렉션에서 db.collection.update()multi: false와 함께 사용하려면 _id 필드에 정확히 일치하는 항목을 포함하거나 단일 샤드를 대상으로 지정해야 합니다(예: 샤드 키 포함).

db.collection.update()가 업데이트 작업을 수행할 때(문서 교체 작업은 아님) db.collection.update()는 여러 샤드를 대상으로 할 수 있습니다.

다음도 참조하세요.

문서 교체 작업은 먼저 쿼리 필터를 사용하여 단일 샤드를 대상으로 시도합니다. 작업이 쿼리 필터로 단일 샤드를 대상으로 지정할 수 없는 경우 대체 문서로 대상을 지정하려고 시도합니다.

이전 버전에서는 작업이 교체 문서를 사용하여 대상을 지정하려고 시도했습니다.

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

  • 업데이트 작업의 경우.

  • 문서 바꾸기 작업의 경우.

그러나 샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. 샤드 키가 누락된 문서를 대상으로 하려면 null 동등성 매치를 다른 필터 조건(예: _id 필드)과 함께 사용할 수 있습니다. 예를 들면 다음과 같습니다.

{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key

샤드 키 필드가 변경할 수 없는 _id 필드가 아닌 경우 문서의 샤드 키 값을 업데이트할 수 있습니다.

기존 샤드 키 값을 db.collection.update()으로 수정하려면 다음을 수행합니다.

  • 반드시 mongos에서 실행해야 합니다. 샤드에서 직접 작업을 실행하지 않아야 합니다.

  • 반드시 트랜잭션에서 실행하거나 재시도 가능 쓰기로 실행해야 합니다 .

  • 반드시 multi: false를 지정해야 합니다.

  • 전체 샤드 키에 동등 쿼리 필터포함해야 합니다.

누락된 키 값은 null 동등성 매치의 일부로 반환되므로 null 값 키가 업데이트되지 않도록 하려면 추가 쿼리 조건(예: _id 필드)을 적절히 포함하세요.

샤딩된 컬렉션에서 upsert도 참조하세요.

샤딩된 컬렉션의 문서에는 샤드 키 필드가 누락될 수 있습니다. db.collection.update()를 사용하여 문서의 누락된 샤드 키를 설정하려면 mongos에서 실행해야 합니다. 샤드에서 바로 연산을 실행하지는 마세요.

또한 다음 요구 사항도 적용됩니다.

작업
요구 사항:
설정 방법 null
  • multi: true를 지정할 수 있습니다.

  • upsert: true인 경우 전체 샤드 키에 대한 동일성 필터가 필요합니다.

null이 아닌 값으로 설정하려면 다음 단계를 따르세요.
  • 반드시 트랜잭션 내에서 또는 재시도 가능 쓰기로 수행해야 합니다.

  • multi: false지정해야 합니다.

  • 다음 중 하나의 경우 전체 샤드 키에 대해 동일성 필터가 필요합니다.

    • upsert: true또는

    • 교체 문서를 사용하고 새 샤드 키 값이 다른 샤드에 속하는 경우입니다.

누락된 키 값은 null 동등성 매치의 일부로 반환되므로 null 값 키가 업데이트되지 않도록 하려면 추가 쿼리 조건(예: _id 필드)을 적절히 포함하세요.

다음도 참조하세요.

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

중요

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

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

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

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

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

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

다음 탭에는 다양한 일반 update() 작업이 나와 있습니다.

mongosh에서 다음 문서가 포함된 books 컬렉션을 만듭니다. 이 명령은 먼저 books 컬렉션에서 이전에 존재하는 모든 문서를 제거합니다.

db.books.remove({});
db.books.insertMany([
{
"_id" : 1,
"item" : "TBD",
"stock" : 0,
"info" : { "publisher" : "1111", "pages" : 430 },
"tags" : [ "technology", "computer" ],
"ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
"reorder" : false
},
{
"_id" : 2,
"item" : "XYZ123",
"stock" : 15,
"info" : { "publisher" : "5555", "pages" : 150 },
"tags" : [ ],
"ratings" : [ { "by" : "xyz", "rating" : 5 } ],
"reorder" : false
}
]);

$set 수정자를 사용하는 것과 같이 <update> 문서에 업데이트 연산자 수정자가 포함된 경우, 다음을 수행하세요.

  • <update> 문서에는 업데이트 연산자 표현식만 포함되어야 합니다.

  • db.collection.update() 메서드는 문서의 해당 필드만 업데이트합니다.

    • 내장된 문서 또는 배열을 전체적으로 업데이트하려면 필드에 대한 대체 값을 지정하십시오.

    • 내장된 문서 또는 배열의 특정 필드를 업데이트하려면 점 표기법을 사용하여 필드를 지정합니다.

db.books.update(
{ _id: 1 },
{
$inc: { stock: 5 },
$set: {
item: "ABC123",
"info.publisher": "2222",
tags: [ "software" ],
"ratings.1": { by: "xyz", rating: 3 }
}
}
)

이 작업에서는 다음을 수행합니다.

  • { _id: 1 }<query> 매개 변수는 업데이트할 문서를 지정합니다.

  • $inc 연산자는 stock 필드를 증가시킵니다.

  • $set 연산자는 값을 대체합니다.

    • item 필드

    • publisher info 내장된 문서의 필드,

    • tags 필드 및

    • ratings 배열의 두 번째 요소.

업데이트된 문서는 다음과 같습니다.

{
"_id" : 1,
"item" : "ABC123",
"stock" : 5,
"info" : { "publisher" : "2222", "pages" : 430 },
"tags" : [ "software" ],
"ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],
"reorder" : false
}

이 작업은 다음 SQL 문에 해당합니다.

UPDATE books
SET stock = stock + 5
item = "ABC123"
publisher = 2222
pages = 430
tags = "software"
rating_authors = "ijk,xyz"
rating_values = "4,3"
WHERE _id = 1

참고

query 매개변수가 여러 문서와 일치하는 경우 이 작업은 일치하는 문서 하나만 업데이트합니다. 여러 문서를 업데이트하려면 multi 옵션을 true로 설정해야 합니다.

다음도 참조하세요.

다음 작업에서는 $push 업데이트 연산자를 사용하여 ratings 배열에 새 객체를 추가합니다.

db.books.update(
{ _id: 2 },
{
$push: { ratings: { "by" : "jkl", "rating" : 2 } }
}
)

업데이트된 문서는 다음과 같습니다.

{
"_id" : 2,
"item" : "XYZ123",
"stock" : 15,
"info" : {
"publisher" : "5555",
"pages" : 150
},
"tags" : [ ],
"ratings" : [
{ "by" : "xyz", "rating" : 5 },
{ "by" : "jkl", "rating" : 2 }
],
"reorder" : false
}

다음도 참조하세요.

다음 작업은 $unset 연산자 를 사용하여 { _id: 1 } 이 있는 문서 에서 tags 필드 를 제거 합니다.

db.books.update( { _id: 1 }, { $unset: { tags: 1 } } )

업데이트된 문서는 다음과 같습니다.

{
"_id" : 1,
"item" : "TBD",
"stock" : 0,
"info" : {
"publisher" : "1111",
"pages" : 430
},
"ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "lmn", "rating" : 5 } ],
"reorder" : false
}

$unset 에 해당하는 직접 SQL 은 없지만 $unsetbooks 테이블에서 tags 필드 를 제거하는 다음 SQL 명령과 유사합니다.

ALTER TABLE books
DROP COLUMN tags

다음도 참조하세요.

multi이(가) true(으)로 설정된 경우 db.collection.update() 메서드는 <query> 조건을 충족하는 모든 문서를 업데이트합니다. multi 업데이트 작업은 다른 읽기/쓰기 작업에 끼어들 수 있습니다.

다음 작업은 stock이(가) 10보다 작거나 같은 모든 문서에 대해 reorder 필드를 true(으)로 설정합니다. 일치하는 문서에 reorder 필드가 없으면 $set 연산자는 지정된 값을 사용하여 필드를 추가합니다.

db.books.update(
{ stock: { $lte: 10 } },
{ $set: { reorder: true } },
{ multi: true }
)

컬렉션의 결과 문서는 다음과 같습니다.

[
{
"_id" : 1,
"item" : "ABC123",
"stock" : 5,
"info" : {
"publisher" : "2222",
"pages" : 430
},
"ratings" : [ { "by" : "ijk", "rating" : 4 }, { "by" : "xyz", "rating" : 3 } ],
"reorder" : true
}
{
"_id" : 2,
"item" : "XYZ123",
"stock" : 10,
"info" : { "publisher" : "2255", "pages" : 150 },
"tags" : [ "baking", "cooking" ],
"reorder" : true
}
]

이 작업은 다음 SQL 문에 해당합니다.

UPDATE books
SET reorder=true
WHERE stock <= 10

참고

교체를 수행할 때, 즉 <update> 문서에 field:value 표현식 포함된 경우에는 multi: true을(를) 지정할 수 없습니다.

다음도 참조하세요.

upsert: true옵션을 지정하는 경우:

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

다음 탭에서는 update()와 함께 upsert 수정자를 다양하게 사용하는 방법을 보여 줍니다.

쿼리 기준과 일치하는 문서가 없고 <update> 매개변수가 대체 문서인 경우(즉, 필드와 값 쌍만 포함된 경우) 업데이트는 대체 문서의 필드와 값으로 새 문서를 삽입합니다.

  • 쿼리 매개 변수 또는 대체 문서에서 _id 필드를 지정하는 경우 MongoDB는 삽입된 문서에서 해당 _id 필드를 사용합니다.

  • 쿼리 매개변수나 대체 문서에 _id 필드를 지정하지 않으면 MongoDB는 무작위로 생성된 ObjectId 값으로 _id 필드를 추가합니다.

    참고

    쿼리 매개변수와 대체 문서에 다른 _id 필드 값을 지정할 수 없습니다. 그렇게 하면 작동 오류가 발생합니다.

예를 들어 다음 업데이트는 업서트 옵션을 true로 설정합니다.

db.books.update(
{ item: "ZZZ135" }, // Query parameter
{ $set:
{
item: "ZZZ135", stock: 5, tags: [ "database" ] // Replacement document
}
},
{ upsert: true } // Options
)

<query> 매개변수와 일치하는 문서가 없으면 업데이트 작업은 대체 문서 포함된 문서를 삽입합니다. 대체 문서 또는 쿼리 문서에 _id 필드가 지정되지 않았으므로 이 작업은 새 문서의 _id 필드에 대해 고유한 ObjectId를 새로 만듭니다. 작업의 WriteResultupsert이(가) 반영된 것을 볼 수 있습니다.

WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5da78973835b2f1c75347a83")
})

이 작업은 books 컬렉션에 다음 문서를 삽입합니다(ObjectId 값은 다를 수 있음).

{
"_id" : ObjectId("5da78973835b2f1c75347a83"),
"item" : "ZZZ135",
"stock" : 5,
"tags" : [ "database" ]
}

쿼리 기준과 일치하는 문서가 없고 <update> 매개변수가 업데이트 연산자 표현식이 있는 문서인 경우 작업은 <query> 매개변수의 등호 절에서 기본 문서를 생성하고 <update> 매개변수의 표현식을 적용합니다.

<query>비교 작업은 새 문서 에 포함되지 않습니다. 새 문서 에 _id 필드 가 포함되지 않은 경우 MongoDB 는 ObjectId 값과 함께 _id 필드 를 추가합니다.

예를 들어 다음 업데이트는 업서트 옵션을 true로 설정합니다.

db.books.update(
{ item: "BLP921" }, // Query parameter
{ // Update document
$set: { reorder: false },
$setOnInsert: { stock: 10 }
},
{ upsert: true } // Options
)

쿼리 조건과 일치하는 문서가 없는 경우 작업은 다음 문서 를 삽입합니다( ObjectId 값은 다름).

{
"_id" : ObjectId("5da79019835b2f1c75348a0a"),
"item" : "BLP921",
"reorder" : false,
"stock" : 10
}

다음도 참조하세요.

<update> 매개변수가 집계 파이프라인인 경우 업데이트에서는 <query> 매개변수의 동등 조항을 사용하여 기본 문서를 만든 다음 해당 파이프라인을 문서에 적용하여 삽입할 문서를 만듭니다. 새 문서에 _id 필드가 포함되어 있지 않으면 MongoDB는 ObjectId 값과 함께 _id 필드를 추가합니다.

예를 들어 다음 upsert: true 작업은 사용하는 집계 파이프라인을 지정합니다.

  • $setOnInsert 업데이트 연산자 표현식과 다소 유사한 동작을 제공할 수 있는 $replaceRoot 단계,

  • $set 업데이트 연산자 표현식과 유사한 동작을 제공할 수 있는 $set 단계,

  • 집계 변수 NOW는 현재 날짜/시간으로 해석되며 $currentDate 업데이트 연산자 표현식과 유사한 동작을 제공할 수 있습니다.

db.books.update(
{ item: "MRQ014", ratings: [2, 5, 3] }, // Query parameter
[ // Aggregation pipeline
{ $replaceRoot: { newRoot: { $mergeObjects: [ { stock: 0 }, "$$ROOT" ] } } },
{ $set: { avgRating: { $avg: "$ratings" }, tags: [ "fiction", "murder" ], lastModified: "$$NOW" } }
],
{ upsert: true } // Options
)

<query> 매개변수와 일치하는 문서가 없으면 작업은 다음 문서를 books 컬렉션에 삽입합니다(ObjectId 값은 다릅니다).

{
"_id" : ObjectId("5e2921e0b4c550aad59d1ba9"),
"stock" : 0,
"item" : "MRQ014",
"ratings" : [ 2, 5, 3 ],
"avgRating" : 3.3333333333333335,
"tags" : [ "fiction", "murder" ],
"lastModified" : ISODate("2020-01-23T04:32:32.951Z")
}

다음도 참조하세요.

집계 파이프라인을 사용한 업데이트의 더 많은 예시는 집계 파이프라인을 사용한 업데이트를 참조하세요.

mongosh에서 다음 문서를 books 컬렉션에 삽입합니다.

db.books.insertMany( [
{
_id: 5,
item: "RQM909",
stock: 18,
info: { publisher: "0000", pages: 170 },
reorder: true
},
{
_id: 6,
item: "EFG222",
stock: 15,
info: { publisher: "1111", pages: 72 },
reorder: true
}
] )

다음 작업은 multi 옵션과 upsert 옵션을 모두 지정합니다. 일치하는 문서가 있는 경우, 이 작업은 일치하는 모든 문서를 업데이트합니다. 일치하는 문서가 없는 경우 새 문서가 삽입됩니다.

db.books.update(
{ stock: { $gte: 10 } }, // Query parameter
{ // Update document
$set: { reorder: false, tags: [ "literature", "translated" ] }
},
{ upsert: true, multi: true } // Options
)

이 작업은 일치하는 모든 문서를 업데이트하고 다음과 같은 결과를 가져옵니다.

{
"_id" : 5,
"item" : "RQM909",
"stock" : 18,
"info" : { "publisher" : "0000", "pages" : 170 },
"reorder" : false,
"tags" : [ "literature", "translated" ]
}
{
"_id" : 6,
"item" : "EFG222",
"stock" : 15,
"info" : { "publisher" : "1111", "pages" : 72 },
"reorder" : false,
"tags" : [ "literature", "translated" ]
}

컬렉션에 일치하는 문서가 없는 경우, 조작은 <query><update> 사양 모두의 필드를 사용하여 단일 문서를 삽입하는 결과를 낳습니다. 예를 들어 다음 작업을 가정해 보겠습니다.

db.books.update(
{ "info.publisher": "Self-Published" }, // Query parameter
{ // Update document
$set: { reorder: false, tags: [ "literature", "hardcover" ], stock: 25 }
},
{ upsert: true, multi: true } // Options
)

이 작업은 books 컬렉션에 다음 문서를 삽입합니다(ObjectId 값은 다를 수 있음).

{
"_id" : ObjectId("5db337934f670d584b6ca8e0"),
"info" : { "publisher" : "Self-Published" },
"reorder" : false,
"stock" : 25,
"tags" : [ "literature", "hardcover" ]
}

upsert: trueupdate()를 실행할 때 쿼리와 일치하는 기존 문서가 없는 경우, 쿼리가 점 표기법을 사용하여 _id 필드에 조건을 지정하면 MongoDB는 새 문서 삽입을 거부합니다.

이 제한은 _id 문서에 포함된 필드 순서가 잘 정의되고 쿼리에 지정된 순서에 바인딩되지 않도록 합니다.

이런 방식으로 문서를 삽입하려고 하면 MongoDB에서 오류가 발생합니다. 예를 들어 다음 업데이트 작업을 가정해 보겠습니다. 업데이트 작업은 upsert:true를 지정하고 쿼리는 점 표기법을 사용하여 _id 필드에 조건을 지정하므로, 삽입할 문서를 구성할 때 업데이트로 인해 오류가 발생합니다.

db.collection.update(
{ "_id.name": "Robert Frost", "_id.uid": 0 }, // Query parameter
{ $set:
{
"categories": [ "poet", "playwright" ] // Replacement document
}
},
{ upsert: true } // Options
)

해당 작업의 WriteResult는 다음 오류를 반환합니다.

WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 111,
"errmsg" : "field at '_id' must be exactly specified, field at sub-path '_id.name'found"
}
})

다음도 참조하세요.

중복을 방지하는 고유 인덱스 가 없는 경우 업서트는 중복 문서를 생성할 수 있습니다.

이름이 Andy인 문서가 없고 여러 클라이언트가 대략 동시에 다음 명령을 실행하는 예시를 가정해 보겠습니다.

db.people.update(
{ name: "Andy" },
{ $inc: { score: 1 } },
{
upsert: true,
multi: true
}
)

클라이언트가 데이터를 성공적으로 삽입하기 전에 모든 update() 연산에서 쿼리 단계가 완료되었으며 name 필드에 고유 인덱스가 없는 경우 각 update() 연산에서 삽입이 발생하여 name: Andy가 포함된 문서가 여러 개 생성될 수 있습니다.

name 필드의 고유 인덱스는 문서가 하나만 생성되도록 합니다. 이 고유 인덱스가 적용되면 이제 여러 update() 연산이 다음과 같은 동작을 나타냅니다.

  • 정확히 하나의 update() 작업으로 새 문서가 성공적으로 삽입됩니다.

  • 다른 update() 작업은 새로 삽입된 문서를 업데이트하거나 고유 키 충돌로 인해 실패합니다.

    다른 update() 작업을 통해 새로 삽입한 문서를 업데이트하려면 다음 조건을 모두 충족해야 합니다.

    • target collection에 중복 키 오류를 일으킬 수 있는 고유 인덱스가 있습니다.

    • 업데이트 작업이 updateMany 이 아니거나 multifalse 입니다.

    • 업데이트 일치 조건은 둘 중 하나입니다:

      • 단일 동등성 조건자. 예를 들면 다음과 같습니다. { "fieldA" : "valueA" }

      • 동등성 조건자의 논리적 AND. 예를 들면 다음과 같습니다. { "fieldA" : "valueA", "fieldB" : "valueB" }

    • 동등성 조건자의 필드는 고유 인덱스 키 패턴의 필드와 일치합니다.

    • 업데이트 작업은 고유 인덱스 키 패턴의 필드를 수정하지 않습니다.

다음 표는 키 충돌이 발생하면 업데이트를 초래하거나 실패하는 upsert 작업의 예를 보여줍니다.

고유 인덱스 키 패턴
업데이트 작업
결과
{ name : 1 }
db.people.updateOne(
{ name: "Andy" },
{ $inc: { score: 1 } },
{ upsert: true }
)
일치하는 문서의 score 필드가 1씩 증가합니다.
{ name : 1 }
db.people.updateOne(
{ name: { $ne: "Joe" } },
{ $set: { name: "Andy" } },
{ upsert: true }
)
고유 인덱스 키 패턴(name)의 필드를 수정하기 때문에 작업이 실패합니다.
{ name : 1 }
db.people.updateOne(
{ name: "Andy", email: "andy@xyz.com" },
{ $set: { active: false } },
{ upsert: true }
)
동등성 조건자 필드(name, email)가 인덱스 키 필드(name)와 일치하지 않기 때문에 작업이 실패합니다.

다음도 참조하세요.

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

집계 파이프라인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, "students" : "Elizabeth", "points" : 60, "commentsSemester1" : "well behaved", "commentsSemester2" : "needs improvement", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") }
] )

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

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

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

db.members.update(
{ },
[
{ $set: { comments: [ "$commentsSemester1", "$commentsSemester2" ], lastUpdate: "$$NOW" } },
{ $unset: [ "commentsSemester1", "commentsSemester2" ] }
],
{ multi: true }
)

참고

파이프라인에 사용되는 $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" ] }

다음도 참조하세요.

다음 문서로 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") }
] )

집계 파이프라인e을 사용하여 계산된 등급 평균 및 문자 등급으로 문서를 업데이트할 수 있습니다.

db.students3.update(
{ },
[
{ $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"
} } } }
],
{ multi: true }
)

참고

파이프라인에 사용된 $set는 업데이트 연산자 $set가 아닌 집계 단계 $set를 참조합니다.

첫 번째 단계

$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:29:35.340Z"), "average" : 92, "grade" : "A" }
{ "_id" : 2, "tests" : [ 94, 88, 90 ], "lastUpdate" : ISODate("2020-01-24T17:29:35.340Z"), "average" : 90, "grade" : "A" }
{ "_id" : 3, "tests" : [ 70, 75, 82 ], "lastUpdate" : ISODate("2020-01-24T17:29:35.340Z"), "average" : 75, "grade" : "C" }

다음도 참조하세요.

업데이트 문서에서 $[<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 은 집계 파이프라인을 사용하는 업데이트에는 사용할 수 없습니다.

지정된 기준과 일치하는 모든 배열 요소를 업데이트하려면 arrayFilters 매개변수를 사용합니다.

mongosh에서 다음 문서를 사용하여 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.update(
{ grades: { $gte: 100 } },
{ $set: { "grades.$[element]" : 100 } },
{
multi: true,
arrayFilters: [ { "element": { $gte: 100 } } ]
}
)

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

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

배열 필터 매개변수를 사용하여 문서 배열 내의 특정 문서 필드를 업데이트할 수도 있습니다.

mongosh에서 다음 문서를 사용하여 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.update(
{ },
{ $set: { "grades.$[elem].mean" : 100 } },
{
multi: true,
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 }
]
}

mongosh에서 다음 문서를 사용하여 newStudents 컬렉션을 생성하세요.

db.newStudents.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.newStudents.createIndex( { grade: 1 } )

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

db.newStudents.update(
{ points: { $lte: 20 }, grade: "F" }, // Query parameter
{ $set: { comments1: "failed class" } }, // Update document
{ multi: true, hint: { grade: 1 } } // Options
)

참고

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

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

WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

사용된 인덱스를 보려면 작업에 대해 explain을 실행하세요.

db.newStudents.explain().update(
{ "points": { $lte: 20 }, "grade": "F" },
{ $set: { "comments1": "failed class" } },
{ multi: true, hint: { grade: 1 } }
)

db.collection.explain().update()은 문서를 수정하지 않습니다.

버전 5.0에 추가.

명령의 다른 곳에서 액세스할 수 있는 변수를 정의하려면 let 옵션을 사용합니다.

참고

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

컬렉션 cakeFlavors을 만듭니다:

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

다음 예시에서는 let에서 targetFlavornewFlavor 변수를 정의하고 이 변수를 사용하여 케이크를 체리맛에서 오렌지맛으로 변경합니다.

db.cakeFlavors.update(
{ $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
[ { $set: { flavor: "$$newFlavor" } } ],
{ let : { targetFlavor: "cherry", newFlavor: "orange" } }
)

복제본 집합에 대한 다음 작업은 w: 2쓰기 우려를 5000밀리초의 wtimeout 으로 지정합니다. 이 작업은 쓰기가 운영 서버와 보조 서버 모두에 전파되거나 5초 후에 타임아웃된 후에 반환됩니다.

db.books.update(
{ stock: { $lte: 10 } },
{ $set: { reorder: true } },
{
multi: true,
writeConcern: { w: 2, wtimeout: 5000 }
}
)

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

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

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

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

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

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

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

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

mongosh에서 다음 문서를 사용하여 myColl이라는 이름의 컬렉션을 만듭니다.

db.myColl.insertMany( [
{ _id: 1, category: "café", status: "A" },
{ _id: 2, category: "cafe", status: "a" },
{ _id: 3, category: "cafE", status: "a" }
] )

다음 작업에는 데이터 정렬 옵션이 포함되어 있으며 multitrue 으로 설정하여 일치하는 모든 문서를 업데이트합니다:

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

작업의 쓰기 결과는 다음 문서를 반환하며, 이는 컬렉션의 세 문서가 모두 업데이트되었음을 나타냅니다:

WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

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

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

db.collection.update() 메서드는 작업 상태가 포함된 WriteResult() 객체를 반환합니다. 성공하면 WriteResult() 객체에 쿼리 조건과 일치하는 문서 수, 업데이트로 삽입된 문서 수 및 수정된 문서 수가 포함됩니다.

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

db.collection.update() 메서드에서 쓰기 고려 오류가 발생하면 결과에는 WriteResult.writeConcernError 필드가 포함됩니다.

WriteResult({
"nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1,
"writeConcernError": {
"code" : 64,
"errmsg" : "waiting for replication timed out",
"errInfo" : {
"wtimeout" : true,
"writeConcern" : {
"w" : "majority",
"wtimeout" : 100,
"provenance" : "getLastErrorDefaults"
}
}
})

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

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

다음도 참조하세요.

db.collection.update() 메서드에서 쓰기 고려가 아닌 오류가 발생하면 결과에 WriteResult.writeError 필드가 포함됩니다.

WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 7,
"errmsg" : "could not contact primary for replica set shard-a"
}
})

다음도 참조하세요.

돌아가기

db.collection.unhideIndex