문서 수정
이 페이지의 내용
개요
이 가이드에서는 다음 작업을 수행하여 MongoDB .NET/C# 드라이버를 사용하여 MongoDB 컬렉션의 문서를 수정하는 방법에 대해 설명합니다.
.NET/C# 드라이버는 문서를 수정하기 위해 다음과 같은 메서드를 제공하며, 각 메서드에는 비동기 및 동기 버전이 있습니다.
UpdateOneAsync()
orUpdateOne()
UpdateManyAsync()
orUpdateMany()
ReplaceOneAsync()
orReplaceOne()
팁
인터랙티브 랩
이 페이지에는 UpdateManyAsync()
메서드를 사용하여 데이터를 수정하는 방법을 보여주는 짧은 인터랙티브 실습이 포함되어 있습니다. MongoDB 또는 코드 편집기를 설치하지 않고도 브라우저 창에서 직접 이 실습을 완료할 수 있습니다.
실습을 시작하려면 페이지 상단의 Open Interactive Tutorial 버튼을 클릭하세요. 실습을 전체 화면 형식으로 확장하려면 실습 창의 오른쪽 상단 모서리에 있는 전체 화면 버튼(⛶)을 클릭합니다.
샘플 데이터
이 가이드의 예에서는 sample_restaurants
데이터베이스의 restaurants
컬렉션을 사용합니다. 이 컬렉션의 문서는 다음 Restaurant
, Address
, GradeEntry
클래스를 모델로 사용합니다.
public class Restaurant { public ObjectId Id { get; set; } public string Name { get; set; } [ ] public string RestaurantId { get; set; } public string Cuisine { get; set; } public Address Address { get; set; } public string Borough { get; set; } public List<GradeEntry> Grades { get; set; } }
public class Address { public string Building { get; set; } [ ] public double[] Coordinates { get; set; } public string Street { get; set; } [ ] public string ZipCode { get; set; } }
public class GradeEntry { public DateTime Date { get; set; } public string Grade { get; set; } public float? Score { get; set; } }
참고
restaurants
컬렉션 의 문서는 대소문자 명명 규칙을 사용합니다. 이 가이드 의 예제에서는 ConventionPack
를 사용하여 컬렉션 의 필드를 파스칼식 대/소문자로 역직렬화하고 Restaurant
클래스의 속성에 매핑합니다.
사용자 지정 직렬화에 대해 자세히 알아보려면 사용자 지정 직렬화를 참조하세요.
이 컬렉션은 Atlas에서 제공하는 샘플 데이터 세트에서 가져온 것입니다. 퀵 스타트를 참조하여 무료 버전의 MongoDB 클러스터를 생성하고 이 샘플 데이터를 로드하는 방법을 알아보세요.
업데이트 작업
다음 방법을 사용하여 MongoDB에서 업데이트 작업을 수행할 수 있습니다.
UpdateOne()
검색 조건과 일치하는 첫 번째 문서가 업데이트됩니다.UpdateMany()
검색 조건과 일치하는 모든 문서가 업데이트됩니다.
필수 매개변수
각 업데이트 방법에는 다음 매개변수가 필요합니다.
업데이트할 레코드를 결정하는 쿼리 필터 문서입니다. 쿼리 필터에 대한 자세한 내용은 MongoDB 서버 매뉴얼 을 참조하세요.
업데이트 연산자 (수행할 업데이트 의 종류)와 변경해야 하는 필드 및 값을 지정하는 업데이트 문서 입니다. 업데이트 연산자의 전체 목록과 사용법은 필드 업데이트 연산자 매뉴얼 페이지 를 참조하세요.
.NET/C# 드라이버는 쿼리 필터와 업데이트 문서 생성을 간소화하는 Builders
클래스를 제공합니다. 다음 코드 샘플은 Builders
를 사용하여 업데이트 작업에서 매개변수로 사용할 두 문서를 만듭니다.
cuisine
필드 값이 'Pizza'인 레스토랑을 검색하는 쿼리 필터해당 레스토랑의
cuisine
필드 값을 'Pasta and breadsticks'로 설정하는 업데이트 문서
const string oldValue = "Pizza"; const string newValue = "Pasta and breadsticks"; // Creates a filter for all documents with a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(restaurant => restaurant.Cuisine, oldValue); // Creates instructions to update the "cuisine" field of documents that // match the filter var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Cuisine, newValue); // Updates all documents that have a "cuisine" value of "Pizza" return _restaurantsCollection.UpdateMany(filter, update);
팁
업데이트 작업의 집계 파이프라인
MongoDB 버전 4.2 이상을 사용하는 경우 업데이트 작업에서 집계 단계의 하위 집합으로 구성된 집계 파이프라인을 사용할 수 있습니다. 업데이트 작업에 사용되는 집계 파이프라인에서 MongoDB가 지원하는 애그리게이션 단계에 대한 자세한 내용은 집계 파이프라인으로 업데이트 빌드에 대한 튜토리얼을 참조하세요 .
하나의 문서 업데이트
다음 코드는 비동기 UpdateOneAsync()
메서드 또는 동기 UpdateOne()
메서드를 사용하여 단일 문서를 업데이트하는 방법을 보여줍니다.
var result = await _restaurantsCollection.UpdateOneAsync(filter, update);
var result = _restaurantsCollection.UpdateOne(filter, update);
다수 문서 업데이트
다음 코드는 비동기 UpdateManyAsync()
메서드 또는 동기 UpdateMany()
메서드를 사용하여 일치하는 모든 문서를 업데이트하는 방법을 보여줍니다.
var result = await _restaurantsCollection.UpdateManyAsync(filter, update);
var result = _restaurantsCollection.UpdateMany(filter, update);
팁
추가 정보에서 이러한 메서드를 사용하는 실행 가능한 예시를 찾아보세요.
업데이트 작업 사용자 지정
두 메서드 모두 업데이트 작업을 구성하는 데 사용할 수 있는 옵션을 나타내는 UpdateOptions
객체를 추가 매개변수로 선택적으로 허용합니다. UpdateOptions
속성을 지정하지 않으면 드라이버가 업데이트 작업을 사용자 지정하지 않습니다.
UpdateOptions
유형을 사용하면 다음과 같은 속성을 가진 옵션을 구성할 수 있습니다.
속성 | 설명 |
---|---|
ArrayFilters | Specifies which array elements to modify for an update operation on an array field.
See the MongoDB server manual
for more information. |
BypassDocumentValidation | Specifies whether the update operation bypasses document validation. This lets you
update documents that don't meet the schema validation requirements, if any
exist. See the MongoDB server manual
for more information on schema validation. |
Collation | Specifies the kind of language collation to use when sorting
results. See the MongoDB server manual
for more information on collation. |
Comment | Gets or sets the user-provided comment for the operation.
See the MongoDB server manual
for more information. |
Hint | Gets or sets the index to use to scan for documents.
See the MongoDB server manual
for more information. |
IsUpsert | Specifies whether the update operation performs an upsert operation if no
documents match the query filter.
See the MongoDB server manual
for more information. |
Let | Gets or sets the let document.
See the MongoDB server manual
for more information. |
반환 값
UpdateOne()
및 UpdateMany()
메서드는 각각 UpdateResult
객체를 반환합니다. UpdateResult
유형에는 다음과 같은 속성이 포함되어 있습니다.
속성 | 설명 |
---|---|
IsAcknowledged | Indicates whether the update operation was acknowledged by MongoDB. |
IsModifiedCountAvailable | Indicates whether you can read the count of updated records on the
UpdateResult . |
MatchedCount | The number of documents that matched the query filter, regardless of
how many were updated. |
ModifiedCount | The number of documents updated by the update operation. If an updated
document is identical to the original, it won't be included in this count. |
UpsertedId | The ID of the document that was upserted in the database, if the driver
performed an upsert. |
예시
다음 코드는 UpdateMany()
메서드를 사용하여 borough
필드의 값이 "Manhattan"인 모든 문서를 찾은 다음 이러한 문서의 borough
값을 "Manhattan(north)"으로 업데이트합니다. IsUpsert
옵션이 true
로 설정되어 있으므로 쿼리 필터가 기존 문서와 일치하지 않는 경우 드라이버가 새 문서를 삽입합니다.
var filter = Builders<Restaurant>.Filter .Eq(restaurant => restaurant.Borough, "Manhattan"); var update = Builders<Restaurant>.Update .Set(restaurant => restaurant.Borough, "Manhattan (north)"); UpdateOptions opts = new UpdateOptions() { Comment = new BsonString("Borough updated for C# Driver Fundamentals"), IsUpsert = true }; Console.WriteLine("Updating documents..."); var result = _restaurantsCollection.UpdateMany(filter, update, opts); Console.WriteLine($"Updated documents: {result.ModifiedCount}"); Console.WriteLine($"Result acknowledged? {result.IsAcknowledged}");
Updating documents... Updated documents: 10259 Result acknowledged? True
참고
앞에 설명한 예에서 UpdateMany()
대신 UpdateOne()
메서드를 사용한 경우 드라이버는 일치하는 두 문서 중 첫 번째 문서만 업데이트합니다.
대체 작업
MongoDB에서 ReplaceOne()
메서드를 사용하여 대체 작업을 수행할 수 있습니다. 이 메서드는 검색 조건과 일치하는 첫 번째 문서에서 _id
필드를 제외한 모든 필드를 제거한 다음 지정한 필드와 값을 문서에 삽입합니다.
필수 매개변수
이 ReplaceOne()
메서드에는 다음 매개 변수가 필요합니다.
대체할 기록를 결정하는 쿼리 필터 문서입니다.
새 문서에 삽입할 필드와 값을 지정하는 대체 문서입니다. 컬렉션의 문서가 C# 클래스에 매핑된 경우 대체 문서는 이 클래스의 인스턴스가 될 수 있습니다.
업데이트 작업과 마찬가지로 .NET/C# 드라이버의 Builders
클래스를 사용하여 쿼리 필터를 만들 수 있습니다. 다음 코드 샘플은 Builders
를 사용하여 name
필드 값이 "Pizza Town"인 레스토랑을 검색하는 쿼리 필터를 만드는 데 사용됩니다. 이 코드는 또한 일치하는 첫 번째 문서를 대체할 새 Restaurant
객체를 만듭니다.
// Creates a filter for all restaurant documents that have a "cuisine" value of "Pizza" var filter = Builders<Restaurant>.Filter .Eq(r => r.Cuisine, "Pizza"); // Finds the ID of the first restaurant document that matches the filter var oldPizzaRestaurant = _restaurantsCollection.Find(filter).First(); var oldId = oldPizzaRestaurant.Id; // Generates a new restaurant document Restaurant newPizzaRestaurant = new() { Id = oldId, Name = "Mongo's Pizza", Cuisine = "Pizza", Address = new() { Street = "Pizza St", ZipCode = "10003" }, Borough = "Manhattan", }; // Replaces the existing restaurant document with the new document return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant);
중요
_id
필드의 값은 변경할 수 없습니다. 대체 문서에서 _id
필드 값을 지정하는 경우 기존 문서의 _id
값과 일치해야 합니다.
다음 코드는 비동기 ReplaceOneAsync()
메서드 또는 동기 ReplaceOne()
메서드를 사용하여 단일 문서를 대체하는 방법을 보여줍니다.
var result = await _restaurantsCollection.ReplaceOneAsync(filter, newRestaurant);
var result = _restaurantsCollection.ReplaceOne(filter, newRestaurant);
팁
추가 정보에서 이러한 메서드를 사용하는 실행 가능한 예시를 찾아보세요.
대체 작업 사용자 지정
ReplaceOne()
메서드는 대체 작업을 구성하는 데 사용할 수 있는 옵션을 나타내는 ReplaceOptions
객체를 추가 매개변수로 선택적으로 허용합니다. ReplaceOptions
속성을 지정하지 않으면 드라이버가 대체 작업을 사용자 지정하지 않습니다.
ReplaceOptions
유형을 사용하면 다음과 같은 속성을 가진 옵션을 구성할 수 있습니다.
속성 | 설명 |
---|---|
BypassDocumentValidation | Specifies whether the replace operation bypasses document validation. This lets you
replace documents that don't meet the schema validation requirements, if any
exist. See the MongoDB server manual
for more information on schema validation. |
Collation | Specifies the kind of language collation to use when sorting
results. See the MongoDB server manual
for more information on collation. |
Comment | Gets or sets the user-provided comment for the operation.
See the MongoDB server manual
for more information. |
Hint | Gets or sets the index to use to scan for documents.
See the MongoDB server manual
for more information. |
IsUpsert | Specifies whether the replace operation performs an upsert operation if no
documents match the query filter.
See the MongoDB server manual
for more information. |
Let | Gets or sets the let document.
See the MongoDB server manual
for more information. |
반환 값
ReplaceOne()
메서드는 ReplaceOneResult
객체를 반환합니다. ReplaceOneResult
유형에는 다음과 같은 속성이 포함되어 있습니다.
속성 | 설명 |
---|---|
IsAcknowledged | Indicates whether the replace operation was acknowledged by MongoDB. |
IsModifiedCountAvailable | Indicates whether you can read the count of replaced records on the
ReplaceOneResult . |
MatchedCount | The number of documents that matched the query filter, regardless of
whether one was replaced. |
ModifiedCount | The number of documents replaced by the replace operation. |
UpsertedId | The ID of the document that was upserted in the database, if the driver
performed an upsert. |
예시
다음 코드는 ReplaceOne()
메서드를 사용하여 name
필드 값이 "Pizza Town"인 첫 번째 문서를 찾은 다음 이 문서를 "Food World"라는 이름의 새 Restaurant
문서로 대체합니다.바꿉니다. IsUpsert
옵션이 true
로 설정되어 있으므로 쿼리 필터가 기존 문서와 일치하지 않는 경우 드라이버가 새 문서를 삽입합니다.
var filter = Builders<Restaurant>.Filter.Eq(restaurant => restaurant.Name, "Pizza Town"); Restaurant newRestaurant = new() { Name = "Food World", Cuisine = "American", Address = new BsonDocument { {"street", "Food St"}, {"zipcode", "10003"}, }, Borough = "Manhattan", }; ReplaceOptions opts = new ReplaceOptions() { Comment = new BsonString("Restaurant replaced for .NET/C# Driver Fundamentals"), IsUpsert = true }; Console.WriteLine("Replacing document..."); var result = _restaurantsCollection.ReplaceOne(filter, newRestaurant, opts); Console.WriteLine($"Replaced documents: {result.ModifiedCount}"); Console.WriteLine($"Result acknowledged? {result.IsAcknowledged}");
Replacing document... Replaced documents: 1 Result acknowledged? True
추가 정보
업데이트 및 대체 작업의 실행 가능한 예는 다음 사용 예시를 참조하세요.
쿼리 필터 생성에 대해 자세히 알아보려면 쿼리 지정 가이드를 참조하세요.
API 문서
이 가이드에서 사용되는 메서드 또는 유형에 대해 자세히 알아보려면 다음 API 설명서를 참조하세요.