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 单个领域类型结果会检索并删除第一个匹配的文档。