分片
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;
}
分片键的属性会被映射到实际的字段名称。
分片集合
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);
分片命令需要在 admin 数据库上运行。
如果需要,为特定数据库启用分片。
在已启用分片的数据库中分片一个集合。
指定分片键。此示例使用基于范围的分片。
分片键处理
分片键由一个或多个属性组成,这些属性必须存在于目标集合中的每个文档中。它用于将文档分布到各个分片上。
将 @Sharded
注解添加到实体中,可以使 Spring Data MongoDB 在分片场景下应用最佳优化策略。这主要意味着在 upsert 实体时,如果尚未包含分片键信息,则会将所需的分片键信息添加到 replaceOne
过滤查询中。这可能需要额外的服务器往返来确定当前分片键的实际值。
提示
通过设置 @Sharded(immutableKey = true)
,Spring Data 不会尝试检查实体的分片键是否被更改。
请参阅 MongoDB 文档 了解更多详情。以下列表包含哪些操作符合分片键自动包含的条件:
-
(Reactive)CrudRepository.save(…)
-
(Reactive)CrudRepository.saveAll(…)
-
(Reactive)MongoTemplate.save(…)