MongoDB-specific Data Manipulation Methods
除了 query methods 之外,还可以使用专门的方法更新数据。
Update Methods
你还可以使用前表中的关键字来创建查询,这些查询标识与之匹配的文档以对它们运行更新。实际更新操作是由方法本身上的`@Update`注释定义的,如下面的清单所示。请注意,派生查询的命名模式以`find`开头。只有与`@Query`结合使用才允许使用`update`(如`updateAllByLastname(…)`)。
更新应用于*所有*匹配的文档,并且*不能*通过传入`Page`或使用任何[限制关键字,repositories.limit-query-result]来限制范围。返回类型可以是`void`或数字类型,例如`long`,以保存已修改文档的数量。
Example 1. Update Methods
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 | 用于更新的过滤器查询是从方法名称派生的。更新是 “as is”,并且不绑定任何参数。 |
2 | 实际增量值由绑定到 ?1 占位符的 increment 方法参数定义。 |
3 | 使用 Spring 表达式语言 (SpEL) 进行参数绑定。 |
4 | 使用 pipeline 属性发送 aggregation pipeline updates。 |
5 | 更新可能包含复杂对象。 |
6 | 将 string based query 与更新相结合。 |
存储库更新不会发出持久性或映射生命周期事件。
Delete Methods
前表中的关键字可以与`delete…By`或`remove…By`结合使用,以创建删除匹配文档的查询。
Example 2.
Delete…By
Query- Imperative
-
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 类型包装。
|
5 | 使用返回类型 Flux 会在实际删除所有匹配文档之前检索并返回它们。 |
6 | 数值返回类型直接删除匹配文档,返回已删除文档的总数。 |
7 | 单一域类型结果检索并删除第一个匹配文档。 |