Docs Menu

ドキュメントの置換

このガイドでは、 .NET/ C#ドライバーを使用してMongoDBコレクション内のドキュメントを置き換える方法を学習できます。

.NET/ C#ドライバーは ReplaceOne() メソッドと ReplaceOneAsync() メソッドを提供します。 これらのメソッドは、検索条件に一致する最初のドキュメントからすべてのフィールド( _idフィールドを除く)を削除し、指定したフィールドと値をドキュメントに挿入します。

注意

メソッドのオーバーロード

このページのメソッドの多くには、複数のオーバーロードがあります。 このガイドの例では、各メソッドの 1 つの定義のみを示します。 利用可能なオーバーロードの詳細については、 APIドキュメントを参照してください。

このガイドの例では、 sample_restaurantsデータベースのrestaurantsコレクションを使用します。 このコレクションのドキュメントでは、次のRestaurantAddressGradeEntryクラスをモデルとして使用します。

public class Restaurant
{
public ObjectId Id { get; set; }
public string Name { get; set; }
[BsonElement("restaurant_id")]
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; }
[BsonElement("coord")]
public double[] Coordinates { get; set; }
public string Street { get; set; }
[BsonElement("zipcode")]
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 クラスターを無料で作成して、このサンプル データをロードする方法については、クイック スタートを参照してください。

コレクション内のドキュメントを置き換えるには、ReplaceOne() メソッドまたは ReplaceOneAsync() メソッドを呼び出します。 これらのメソッドは次のパラメーターを受け入れます。

Parameter
説明

filter

置き換えドキュメントを指定するクエリフィルター。Buildersクラスを使用してクエリフィルターを作成できます。 クエリフィルターの詳細については、 MongoDB Serverマニュアルを参照してください。

データ型: FilterDefinition<TDocument>

replacement

置換ドキュメント。新しいドキュメントに挿入するフィールドと値を指定します。コレクション内のドキュメントがC#クラスにマップされている場合、置換ドキュメントはこのクラスのインスタンスになることができます。

データ型: TDocument

options

任意。置換操作の構成を指定する ReplaceOptionsクラスのインスタンス。 デフォルト値は null です。

データ型: ReplaceOptions

cancellationToken

任意。操作 をキャンセルするために使用できるトークン。

データ型 : CancelToken

次のコード例は、置換操作 を実行する方法を示しています。 このコードでは、次の手順が実行されます。

  1. Buildersクラス を使用してクエリフィルターを作成します。 フィルターは、cuisineフィールドの値が "Pizza" であるすべてのドキュメントと一致します。

  2. 新しい Restaurantオブジェクトを作成します。

  3. restaurantsコレクションで ReplaceOne() メソッドを呼び出します。 この操作は、 コレクション内で最初に一致するドキュメントを検索し、それを新しく作成されたドキュメントに置き換えます。

SynchronousAsynchronous対応するコードを表示するには、 タブまたは タブを選択します。

// 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 Address()
{
Street = "Pizza St",
ZipCode = "10003"
},
Borough = "Manhattan",
};
// Replaces the existing restaurant document with the new document
return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant);
// 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 Address()
{
Street = "Pizza St",
ZipCode = "10003"
},
Borough = "Manhattan",
};
// Asynchronously replaces the existing restaurant document with the new document
return await _restaurantsCollection.ReplaceOneAsync(filter, newPizzaRestaurant);

重要

_idフィールドの値は不変です。 置き換えドキュメントで_idフィールドに値が指定される場合は、既存のドキュメントの_id値と一致する必要があります。

置き換えドキュメントで_idフィールドの値が指定されていない場合は、Plain Old CLR/Class Object(POCO)の _idフィールドに [BsonIgnoreIfDefault] 属性を追加できます。 POCO の _idフィールドが ObjectId タイプである場合は、[BsonIgnoreIfDefault] を使用します。

次の例は、この属性を追加する方法を示しています。

public class Restaurant
{
[BsonIgnoreIfDefault]
public ObjectId Id { get; set; }
// Other properties
}

ReplaceOne() メソッドと ReplaceOneAsync() メソッドはオプションで、置換操作 を構成するために使用できるオプションを表す ReplaceOptionsオブジェクトをパラメーターとして受け入れます。

ReplaceOptionsクラスには、次のプロパティが含まれています。

プロパティ
説明

BypassDocumentValidation

置換操作がドキュメントの検証をバイパスするかどうかを指定します。 これにより、スキーマ検証要件を満たさないドキュメントを存在する場合に置き換えることができます。 スキーマ検証の詳細については、 MongoDB Serverマニュアルを参照してください。

データ型: bool?

Collation

結果をソートするときに使用する言語照合の種類を指定します。 照合の詳細については、 MongoDB Serverマニュアルを参照してください。

データ型: 照合

Comment

操作のユーザー指定のコメントを取得または設定します。 詳細については、 MongoDB Server のマニュアルを参照してください。

データ型: BsonValue

Hint

ドキュメントをスキャンするために使用するインデックスを取得または設定します。 詳細については、 MongoDB Server のマニュアルを参照してください。

データ型: BsonValue

IsUpsert

クエリフィルターに一致するドキュメントがない場合に、置換操作でアップサート操作を実行するかどうかを指定します。 詳細については、 MongoDB Server のマニュアルを参照してください。

データ型: bool

Let

letドキュメント を取得または設定します。 詳細については、 MongoDB Server のマニュアルを参照してください。

データ型: BsonDocument

次の例では、前の例と同じ手順を実行しますが、スキーマ検証要件をバイパスするために BypassDocumentValidation オプションも使用されています。 対応するコードを表示するには、Synchronous タブまたは Asynchronousタブを選択します。

// 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 Address()
{
Street = "Pizza St",
ZipCode = "10003"
},
Borough = "Manhattan",
};
var options = new ReplaceOptions
{
BypassDocumentValidation = true
};
// Replaces the existing restaurant document with the new document
return _restaurantsCollection.ReplaceOne(filter, newPizzaRestaurant, options);
// 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 Address()
{
Street = "Pizza St",
ZipCode = "10003"
},
Borough = "Manhattan",
};
var options = new ReplaceOptions
{
BypassDocumentValidation = true
};
// Asynchronously replaces the existing restaurant document with the new document
return await _restaurantsCollection.ReplaceOneAsync(filter, newPizzaRestaurant, options);

ReplaceOne() メソッドは ReplaceOneResultオブジェクトを返し、ReplaceOneAsync() メソッドは Task<ReplaceOneResult>オブジェクトを返します。 ReplaceOneResultクラスには次のプロパティが含まれています。

プロパティ
説明

IsAcknowledged

置き換え操作が MongoDB によって確認されたかどうかを示します。

データ型: bool

IsModifiedCountAvailable

ReplaceOneResultで置換されたレコードの数を読み取れるかどうかを示します。

データ型: bool

MatchedCount

置き換えられたかどうかにかかわらず、クエリフィルターに一致したドキュメントの数。

データ型: long

ModifiedCount

置換操作によって置き換えられたドキュメントの数。

データ型: long

UpsertedId

ドライバーがアップサートを実行した場合、データベースでアップサートされたドキュメントのID。

データ型: BsonValue

このページで使用されているメソッドとクラスの詳細については、次のAPIドキュメントを参照してください。