使用Spring数据MongoDB指定分片集合
我使用SpringBoot和SpringDataMongoDB与底层分片MongoDB集群进行接口。我的Spring Boot应用程序通过使用Spring数据MongoDB指定分片集合,spring,mongodb,spring-boot,spring-data-mongodb,Spring,Mongodb,Spring Boot,Spring Data Mongodb,我使用SpringBoot和SpringDataMongoDB与底层分片MongoDB集群进行接口。我的Spring Boot应用程序通过mongos路由器访问集群 使用SpringDataMongoDB,您可以通过@Document(collection=“nameOfCollection”)指定对象持久化到的集合,或者它默认为类名(第一个字母小写)。这些藏品不需要预先存在;它们可以在运行时创建 要在MongoDB中切分集合,您需要 1-在数据库上启用分片:sh.enableSharding(
mongos
路由器访问集群
使用SpringDataMongoDB,您可以通过@Document(collection=“nameOfCollection”)
指定对象持久化到的集合,或者它默认为类名(第一个字母小写)。这些藏品不需要预先存在;它们可以在运行时创建
要在MongoDB中切分集合,您需要
1-在数据库上启用分片:sh.enableSharding(“myDb”)
2-在分片数据库上对集合进行分片:sh.shardCollection(“myDb.myCollection”,{id:“hashed”})
假设存在分片数据库,Spring Data MongoDB是否提供了一种使用分片密钥分片集合的方法?据我所知,我无法使用Spring分片集合,因此必须在启动应用程序运行之前配置分片集合。我觉得奇怪的是,Spring允许我使用未定义的集合,但不提供配置集合的方法
编辑:
我已经看到了这两个方面,其中更多地提到了分片MongoDB集群的部署。这个问题假设所有管道都在那里,并且集合本身必须被切分。即使这不是Spring数据解决方案,也提出了一个潜在的解决方案,其中可以从Spring
MongoTemplate获取DB
DB db = mongo.getDB("admin");
DBObject cmd = new BasicDBObject();
cmd.put("shardcollection", "testDB.x");
cmd.put("key", new BasicDBObject("userId", 1));
CommandResult result = db.command(cmd);
尽管这个问题已经很老了,但我还是遇到了同样的问题,而且从最近开始,似乎已经开始提供自定义切分键了
基于注释的分片键配置可在spring data mongodb:3.x上获得,
@文档(“用户”)
@分片(shardKey={“国家”,“用户ID})
公共类用户{
@身份证
长id;
@字段(“用户ID”)
字符串用户标识;
弦国;
}
到今天为止,spring boot starter mongodb
已经提供了2.x版本。在内部使用save()的更新查询中遇到了同样的问题
它是如何解决的
因此,我现在已经覆盖了SpringBootStarter中的SpringDataMongo核心依赖项,该依赖项在我们的模型中是2.1.x x x 3.x版本,现在支持@Sharded()注释
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.1.5</version>
</dependency>
现在它内部能够分辨出底层的mongo,这就是我们的shardkey。我假设这将进一步修复我们的count()查询,这些查询由于相同的错误“query need to target a shard”而失败。根据文档,这在spring data mongodb 3.0中可用。但是,我找不到maven依赖项。spring data mongodb 3.0是否可用?您可以将其与spring boot版本2.3.0.M3一起使用,该版本可以从快照存储库中提取。安装指南:
@Document(collection = "hotelsdevice")
@Sharded(shardKey = { "device" })
public class Hotel extends BaseModel {