Sharding

MongoDB 通过分片支持大型数据集,而分片是一种将数据分布到多个数据库服务器的方法。请参阅 MongoDB Documentation 以了解如何设置分片集群及其要求和限制。 Spring Data MongoDB 使用 @Sharded 注释标识存储在分片集合中的实体,如下所示。

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

	@Id
	Long id;

	@Field("userid")
	String userId;

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

Sharded Collections

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 指定分片键。此示例使用基于范围的分片。

Shard Key Handling

分片键由目标集合中每个文档都必须存在的单个或多个属性组成。它用于在分片之间分布文档。

@Sharded 注释添加到实体可使 Spring Data MongoDB 对分片方案所需的最佳尝试优化生效。从本质上讲,这意味着在 upsert 实体时,如果尚未存在,则向 replaceOne 筛选器查询添加所需的分片键信息。这可能需要进行额外的服务器往返,以确定当前分片键的实际值。

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

有关详细信息,请参见 MongoDB Documentation。下列列表包含符合分片键自动包含的操作:

  • (Reactive)CrudRepository.save(…)

  • (Reactive)CrudRepository.saveAll(…)

  • (Reactive)MongoTemplate.save(…)