|
此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Data MongoDB 5.0.4! |
分片
MongoDB 通过分片(sharding)支持大型数据集,这是一种将数据分布到多个数据库服务器上的方法。 请参阅MongoDB 文档,了解如何设置分片集群,以及其要求和限制。
Spring Data MongoDB 使用 @Sharded 注解来标识存储在分片集合中的实体,如下所示。
@Document("users")
@Sharded(shardKey = { "country", "userId" }) (1)
public class User {
@Id
Long id;
@Field("userid")
String userId;
String country;
}
| 1 | 分片键的属性会被映射到实际的字段名称。 |
分片集合
Spring Data MongoDB 不会自动为集合设置分片,也不会自动创建分片所需的索引。 下面的代码片段展示了如何使用 MongoDB 客户端 API 来完成这一操作。
MongoDatabase adminDB = template.getMongoDbFactory()
.getMongoDatabase("admin"); (1)
adminDB.runCommand(new Document("enableSharding", "db")); (2)
Document shardCmd = new Document("shardCollection", "db.users") (3)
.append("key", new Document("country", 1).append("userid", 1)); (4)
adminDB.runCommand(shardCmd);
| 1 | 分片命令需要在 admin 数据库上运行。 |
| 2 | 如果需要,为特定数据库启用分片。 |
| 3 | 对启用了分片的数据库中的集合进行分片。 |
| 4 | 指定分片键。 本示例使用基于范围的分片。 |
分片键处理
分片键由一个或多个属性组成,这些属性必须存在于目标集合中的每个文档中。 它用于将文档分布到各个分片上。
在实体上添加 @Sharded 注解可使 Spring Data MongoDB 应用针对分片场景所需的最佳努力优化。
这本质上意味着在执行 upsert 操作时,如果 replaceOne 查询的过滤条件中尚未包含所需的分片键信息,则会自动添加该信息。
这可能需要额外的一次服务器往返通信,以确定当前分片键的实际值。
通过设置 @Sharded(immutableKey = true),Spring Data 不会尝试检查实体的分片键是否已被修改。 |
有关更多详细信息,请参阅MongoDB 文档。 以下列表列出了哪些操作有资格自动包含分片键:
-
(Reactive)CrudRepository.save(…) -
(Reactive)CrudRepository.saveAll(…) -
(Reactive)MongoTemplate.save(…)