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
结合使用,以创建删除匹配文档的查询。
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 | 单个域类型结果检索并删除第一个匹配的文档。 |