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)
}
仓库更新不触发持久化或映射生命周期事件。 |
删除方法
前表中列出的关键字可以与 delete…By
或 remove…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 | 单个领域类型结果会检索并删除第一个匹配的文档。 |