跳到主要内容

MongoDB 专用数据操作方法

DeepSeek V3 中英对照 MongoDB-specific Data Manipulation Methods

除了查询方法,还可以使用专门的方法来更新数据。

更新方法

你也可以使用上表中的关键字创建查询,以识别匹配的文档并对它们运行更新操作。实际的更新操作由方法本身的 @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
}
java
  • 更新操作的过滤查询是从方法名派生的。更新是“原样”进行的,不会绑定任何参数。

  • 实际的增量值由绑定到 ?1 占位符的 increment 方法参数定义。

  • 使用 Spring 表达式语言(SpEL)进行参数绑定。

  • 使用 pipeline 属性来发出 聚合管道更新

  • 更新可能包含复杂对象。

  • 基于字符串的查询 与更新操作结合使用。

注意

仓库更新不会触发持久化或映射生命周期事件。

删除方法

上表中的关键字可以与 delete…Byremove…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
}
java
  • 使用 List 作为返回类型时,会先检索并返回所有匹配的文档,然后再实际删除它们。

  • 使用数值类型的返回类型时,会直接删除匹配的文档,并返回删除的文档总数。

  • 使用单一领域类型作为返回结果时,会检索并删除第一个匹配的文档。

  • 与 3 相同,但结果包装在 Optional 类型中。