MongoDB通过分片支持大型数据集,分片是一种在多个数据库服务器之间分配数据的方法。 请参阅 MongoDB 文档,了解如何设置分片集群、其要求和限制。Spring中文文档

Spring Data MongoDB使用注解来识别存储在分片集合中的实体,如下所示。@ShardedSpring中文文档

@Document("users")
@Sharded(shardKey = { "country", "userId" }) (1)
public class User {

	@Id
	Long id;

	@Field("userid")
	String userId;

	String country;
}
1 分片键的属性将映射到实际的字段名称。
1 分片键的属性将映射到实际的字段名称。

分片集合

Spring Data MongoDB不会自动为集合或索引设置分片。 下面的代码片段显示了如何使用 MongoDB 客户端 API 执行此操作。Spring中文文档

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 指定分片键。 此示例使用基于范围的分片。
1 需要对 admin 数据库运行分片命令。
2 如有必要,为特定数据库启用分片。
3 对启用了分片的数据库中的集合进行分片。
4 指定分片键。 此示例使用基于范围的分片。

分片密钥处理

分片键由一个或多个属性组成,这些属性必须存在于目标集合中的每个文档中。 它用于跨分片分发文档。Spring中文文档

将注释添加到实体使Spring Data MongoDB能够应用分片方案所需的最大努力优化。 这意味着在更新实体时,实质上是添加所需的分片键信息(如果尚不存在)来筛选查询。 这可能需要额外的服务器往返来确定当前分片键的实际值。@ShardedreplaceOneSpring中文文档

通过设置 Spring Data 不会尝试检查实体分片键是否已更改。@Sharded(immutableKey = true)

有关更多详细信息,请参阅 MongoDB 文档。 以下列表包含哪些操作符合分片密钥自动包含条件:Spring中文文档

通过设置 Spring Data 不会尝试检查实体分片键是否已更改。@Sharded(immutableKey = true)