使用 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() 查询,这些查询由于相同的错误“查询需要以碎片为目标”而失败