MongoDB 专用数据操作方法
除了查询方法,还可以使用专门的方法来更新数据。
更新方法
你也可以使用上表中的关键字创建查询,以识别匹配的文档并对它们运行更新操作。实际的更新操作由方法本身的 @Update 注解定义,如下面的代码清单所示。请注意,派生查询的命名模式以 find 开头。只有在与 @Query 结合使用时,才允许使用 update(如 updateAllByLastname(…))。
更新会应用于所有匹配的文档,且无法通过传入一个 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
}
注意
仓库更新不会触发持久化或映射生命周期事件。
删除方法
上表中的关键字可以与 delete…By 或 remove…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
}
- 使用 - List作为返回类型时,会先检索并返回所有匹配的文档,然后再实际删除它们。
- 使用数值类型的返回类型时,会直接删除匹配的文档,并返回删除的文档总数。 
- 使用单一领域类型作为返回结果时,会检索并删除第一个匹配的文档。 
- 与 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
}
- 使用 - Flux作为返回类型时,会先检索并返回所有匹配的文档,然后再实际删除它们。
- 使用数值类型的返回类型时,会直接删除匹配的文档,并返回删除的文档总数。 
- 使用单一领域类型作为返回结果时,会检索并删除第一个匹配的文档。