分片
MongoDB 通过分片支持大型数据集,分片是一种在多个数据库服务器之间分发数据的方法。 请参阅 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 | 需要针对管理数据库运行分片命令。 |
2 | 如有必要,为特定数据库启用分片。 |
3 | 对数据库中启用了分片的集合进行分片。 |
4 | 指定分片键。 此示例使用基于范围的分片。 |
分片键处理
分片键由目标集合中的每个文档中必须存在的单个或多个属性组成。 它用于跨分片分发文档。
添加@Sharded
Comments 添加到实体中,使 Spring Data MongoDB 能够应用分片场景所需的尽力优化。
这意味着本质上是将所需的分片密钥信息(如果尚不存在)添加到replaceOne
更新插入实体时筛选查询。
这可能需要额外的服务器往返才能确定当前分片键的实际值。
通过设置@Sharded(immutableKey = true) Spring Data 不会尝试检查实体分片键是否已更改。 |
有关更多详细信息,请参阅 MongoDB 文档。 以下列表包含哪些作符合分片键自动包含的条件:
-
(Reactive)CrudRepository.save(…)
-
(Reactive)CrudRepository.saveAll(…)
-
(Reactive)MongoTemplate.save(…)