Usage
Spring / Spring Boot Projects
Create a custom
MongoTemplate
bean using the snippet given below.
package com.alpha.mongodb.sharding.example.configuration;
@Configuration
public class CollectionShardedMongoConfiguration {
@Bean("collectionShardedMongoTemplate")
public MongoTemplate collectionShardedMongoTemplate(
@Autowired MongoDatabaseFactory collectionShardedMongoDbFactory) {
CollectionShardingOptions shardingOptions =
CollectionShardingOptions.withIntegerStreamHints(
IntStream.range(0, 3));
return new CollectionShardedMongoTemplate(
collectionShardedMongoDbFactory(), shardingOptions);
}
}
Implement your entity classes from
CollectionShardedEntity
. If this is not a feasible approach for you, then you can always register aHintResolutionCallback
toShardingOptions
and use it. See the section below to get an example usage of Hint Resolution Callback.
// Sample TestShardedEntity
@Document("TEST")
@Data
@FieldNameConstants
public class TestShardedEntity implements CollectionShardedEntity {
@Id
private String id;
@Indexed(unique = true)
private String indexedField;
@Override
public String resolveCollectionHint() {
return String.valueOf(indexedField.charAt(1) - '0');
}
}
Autowire the
collectionShardedMongoTemplate
and use it wherever required.
Using Sharding Hint
In order to route the write queries, the entities are supposed to implement from CollectionShardedEntity. But, the find queries can take place with different criterion, with different fields. In order to route the find query to the right collection, sharding hint is used.
import java.util.Optional;
public class TestRepository {
@Autowired
@Qualifier("collectionShardedMongoTemplate")
private MongoTemplate collectionShardedMongoTemplate;
public Optional<TestShardEntity> findById() {
ShardingHintManager.setCollectionHint("3");
return Optional.ofNullable(
collectionShardedMongoTemplate.findById(
"6427b9327a2cad734d5ff051",
TestShardEntity.class));
}
}
Using HintResolutionCallback
HintResolutionCallback
You can extend your entities from CollectionShardedEntity
to resolve the sharding hint whenever an entity context is passed to the queries. This can also be done using HintResolution callback which a provides couple of methods to resolve hint.
For an entity that is not extending from CollectionShardedEntity
a callback can be registered with Sharding Options by calling ShardingOptions::setHintResolutionCallbacks
. If the callbacks are defined as spring beans they are automatically discovered during initializing application context.
@Data
@org.springframework.data.mongodb.core.mapping.Document("TEST1")
@FieldNameConstants
public class TestEntity1 {
@Id
private String id;
@Indexed(unique = true)
private String indexedField;
public static class TestEntity1HintResolutionCallback implements HintResolutionCallback<TestEntity1> {
@Override
public ShardingHint resolveHintForFindContext(Document query, Class<TestEntity1> entityClass) {
return ShardingHint.withCollectionHint("0");
}
@Override
public ShardingHint resolveHintForSaveContext(TestEntity1 entity) {
return ShardingHint.withCollectionHint("0");
}
}
}
Last updated