シャーディング

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 シャードキーを指定します。この例では、範囲ベースのシャーディングを使用します。

シャードキーの処理

シャードキーは、ターゲットコレクション内のすべてのドキュメントに存在する必要がある 1 つまたは複数のプロパティで構成されます。シャード間でドキュメントを分散するために使用されます。

エンティティに @Sharded アノテーションを追加すると、Spring Data MongoDB はシャーディングシナリオに必要なベストエフォート型の最適化を適用できるようになります。これは本質的に、エンティティの更新 / 挿入時に、必要なシャードキー情報が存在しない場合は、replaceOne フィルタークエリに追加することを意味します。現在のシャードキーの実際の値を決定するには、追加のサーバーラウンドトリップが必要になる場合があります。

@Sharded(immutableKey = true) を設定すると、Spring Data はエンティティのシャードキーが変更されたかどうかを確認しようとしません。

詳細は MongoDB ドキュメント (英語) を参照してください。次のリストには、シャードキーの自動組み込みの対象となる操作が含まれています。

  • (Reactive)CrudRepository.save(…)

  • (Reactive)CrudRepository.saveAll(…)

  • (Reactive)MongoTemplate.save(…)