MongoDB 固有のデータ操作方法
クエリメソッドの次に、特殊なメソッドを使用してデータを更新することができます。
更新メソッド
前の表のキーワードを使用して、更新を実行するために一致するドキュメントを識別するクエリを作成することもできます。実際の更新アクションは、次のように、メソッド自体の @Update
アノテーションによって定義されます。派生クエリの命名スキーマは find
で始まることに注意してください。update
( updateAllByLastname(…)
と同様) の使用は、@Query
と組み合わせた場合にのみ許可されます。
更新は一致するすべてのドキュメントに適用され、Page
を渡したり、制限キーワードを使用したりして範囲を制限することはできません。戻り値の型は、void
または変更されたドキュメントの数を保持する数値型 ( long
など) のいずれかになります。
例 1: 更新メソッド
public interface PersonRepository extends CrudRepository<Person, String> {
@Update("{ '$inc' : { 'visits' : 1 } }")
long findAndIncrementVisitsByLastname(String lastname); (1)
@Update("{ '$inc' : { 'visits' : ?1 } }")
void findAndIncrementVisitsByLastname(String lastname, int increment); (2)
@Update("{ '$inc' : { 'visits' : ?#{[1]} } }")
long findAndIncrementVisitsUsingSpELByLastname(String lastname, int increment); (3)
@Update(pipeline = {"{ '$set' : { 'visits' : { '$add' : [ '$visits', ?1 ] } } }"})
void findAndIncrementVisitsViaPipelineByLastname(String lastname, int increment); (4)
@Update("{ '$push' : { 'shippingAddresses' : ?1 } }")
long findAndPushShippingAddressByEmail(String email, Address address); (5)
@Query("{ 'lastname' : ?0 }")
@Update("{ '$inc' : { 'visits' : ?1 } }")
void updateAllByLastname(String lastname, int increment); (6)
}
1 | 更新のフィルタークエリはメソッド名から派生します。更新は「現状のまま」であり、パラメーターはバインドされません。 |
2 | 実際の増分値は、?1 プレースホルダーにバインドされている increment メソッドの引数によって定義されます。 |
3 | パラメーターのバインドには、Spring 式言語 (SpEL) を使用します。 |
4 | pipeline 属性を使用して、集約パイプラインの更新を発行します。 |
5 | アップデートには複雑なオブジェクトが含まれる場合があります。 |
6 | 文字列ベースのクエリと更新を組み合わせます。 |
リポジトリの更新では、永続性やマッピングのライフサイクルイベントは発生しません。 |
削除メソッド
前の表のキーワードを delete … By
または remove … By
と組み合わせて使用すると、一致するドキュメントを削除するクエリを作成できます。
Delete … By
クエリ 命令的
リアクティブ
public interface PersonRepository extends MongoRepository<Person, String> {
List <Person> deleteByLastname(String lastname); (1)
Long deletePersonByLastname(String lastname); (2)
@Nullable
Person deleteSingleByLastname(String lastname); (3)
Optional<Person> deleteByBirthdate(Date birthdate); (4)
}
1 | 戻り値の型 List を使用すると、実際に削除する前に、一致するすべてのドキュメントを取得して返します。 |
2 | 数値戻り値の型は、一致するドキュメントを直接削除し、削除されたドキュメントの合計数を返します。 |
3 | 単一ドメイン型の結果は、最初に一致したドキュメントを取得して削除します。 |
4 | 3 と同じですが、Optional 型でラップされています。 |
public interface PersonRepository extends ReactiveMongoRepository<Person, String> {
Flux<Person> deleteByLastname(String lastname); (1)
Mono<Long> deletePersonByLastname(String lastname); (2)
Mono<Person> deleteSingleByLastname(String lastname); (3)
}
1 | 戻り値の型 Flux を使用すると、実際に削除する前に、一致するすべてのドキュメントを取得して返します。 |
2 | 数値戻り値の型は、一致するドキュメントを直接削除し、削除されたドキュメントの合計数を返します。 |
3 | 単一ドメイン型の結果は、最初に一致したドキュメントを取得して削除します。 |