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
作为返回类型时,会先检索并返回所有匹配的文档,然后再实际删除它们。使用数值类型的返回类型时,会直接删除匹配的文档,并返回删除的文档总数。
使用单一领域类型作为返回结果时,会检索并删除第一个匹配的文档。