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…Byremove…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 單個領域型別結果會檢索並刪除第一個匹配的文件。