使用 Spring 数据 MongoDB 指定分片集合
Specifing a Sharded Collection with Spring Data MongoDB
我正在使用 Spring 引导和 Spring 数据 MongoDB 与底层分片 MongoDB 集群交互。我的 Spring 引导应用程序通过 mongos
路由器访问集群。
使用 Spring 数据 MongoDB,您可以通过 @Document(collection = "nameOfCollection")
指定对象持久化到的集合,或者它默认为 class 名称(首字母小写).这些集合不需要预先存在;它们可以在运行时创建。
要在 MongoDB 中分片集合,您需要
1 - 在数据库上启用分片:sh.enableSharding("myDb")
2 - 在分片数据库上分片集合:sh.shardCollection("myDb.myCollection", {id:"hashed"})
假设有一个现有的分片数据库,Spring数据MongoDB是否提供了一种使用分片键分片集合的方法?至于我可以说,我无法使用 Spring 对集合进行分片,因此必须在我的 Boot 应用程序运行之前配置分片集合。我觉得奇怪 Spring 允许我使用未定义的集合,但不提供配置集合的方法。
编辑:
我已经看到 Sharding with spring mongo and How configuring access to a sharded collection in spring-data for mongo? 两者更多地指的是分片 MongoDB 集群的部署。这个问题假设所有的管道都在那里,并且集合本身必须被分片。
尽管这不是 Spring 数据解决方案,但在 how to execute mongo admin command from java 中提出了一个潜在的解决方法,其中 DB
可以从 Spring MongoTemplate
.
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
上提供了基于注释的分片键配置,
https://docs.spring.io/spring-data/mongodb/docs/3.0.x/reference/html/#sharding
@Document("users")
@Sharded(shardKey = { "country", "userId" })
public class User {
@Id
Long id;
@Field("userid")
String userId;
String country;
}
截至今天 spring-boot-starter-mongodb
附带 2.x 版本。
我们在内部使用 save() 的更新查询遇到了同样的问题。运行。
怎么解决的?
所以我现在已经覆盖 spring-data-mongo 来自 spring-boot-starter 的核心依赖项,即 2.1.x 3.x 在我们的模型中发布,现在支持@Sharded() 注释。
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.1.5</version>
</dependency>
让你说
@Document(collection = "hotelsdevice")
@Sharded(shardKey = { "device" })
public class Hotel extends BaseModel {
内部现在能够告诉底层 mongo 哪个是我们的 shardkey。我假设这将进一步修复我们的 count() 查询,这些查询由于相同的错误“查询需要以碎片为目标”而失败
我正在使用 Spring 引导和 Spring 数据 MongoDB 与底层分片 MongoDB 集群交互。我的 Spring 引导应用程序通过 mongos
路由器访问集群。
使用 Spring 数据 MongoDB,您可以通过 @Document(collection = "nameOfCollection")
指定对象持久化到的集合,或者它默认为 class 名称(首字母小写).这些集合不需要预先存在;它们可以在运行时创建。
要在 MongoDB 中分片集合,您需要
1 - 在数据库上启用分片:sh.enableSharding("myDb")
2 - 在分片数据库上分片集合:sh.shardCollection("myDb.myCollection", {id:"hashed"})
假设有一个现有的分片数据库,Spring数据MongoDB是否提供了一种使用分片键分片集合的方法?至于我可以说,我无法使用 Spring 对集合进行分片,因此必须在我的 Boot 应用程序运行之前配置分片集合。我觉得奇怪 Spring 允许我使用未定义的集合,但不提供配置集合的方法。
编辑: 我已经看到 Sharding with spring mongo and How configuring access to a sharded collection in spring-data for mongo? 两者更多地指的是分片 MongoDB 集群的部署。这个问题假设所有的管道都在那里,并且集合本身必须被分片。
尽管这不是 Spring 数据解决方案,但在 how to execute mongo admin command from java 中提出了一个潜在的解决方法,其中 DB
可以从 Spring MongoTemplate
.
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
上提供了基于注释的分片键配置,
https://docs.spring.io/spring-data/mongodb/docs/3.0.x/reference/html/#sharding
@Document("users")
@Sharded(shardKey = { "country", "userId" })
public class User {
@Id
Long id;
@Field("userid")
String userId;
String country;
}
截至今天 spring-boot-starter-mongodb
附带 2.x 版本。
我们在内部使用 save() 的更新查询遇到了同样的问题。运行。
怎么解决的?
所以我现在已经覆盖 spring-data-mongo 来自 spring-boot-starter 的核心依赖项,即 2.1.x 3.x 在我们的模型中发布,现在支持@Sharded() 注释。
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.1.5</version>
</dependency>
让你说
@Document(collection = "hotelsdevice")
@Sharded(shardKey = { "device" })
public class Hotel extends BaseModel {
内部现在能够告诉底层 mongo 哪个是我们的 shardkey。我假设这将进一步修复我们的 count() 查询,这些查询由于相同的错误“查询需要以碎片为目标”而失败