【问题标题】:Specifing a Sharded Collection with Spring Data MongoDB使用 Spring Data MongoDB 指定分片集合
【发布时间】:2018-05-12 07:45:30
【问题描述】:

我正在使用 Spring Boot 和 Spring Data MongoDB 与底层分片 MongoDB 集群进行交互。我的 Spring Boot 应用程序通过 mongos 路由器访问集群。

使用 Spring Data MongoDB,您可以通过 @Document(collection = "nameOfCollection") 指定对象持久化到的集合,或者默认为类名(第一个字母小写)。这些集合不需要预先存在;它们可以在运行时创建。

要在 MongoDB 中对集合进行分片,您需要

1 - 在数据库上启用分片:sh.enableSharding("myDb")

2 - 在分片数据库上对集合进行分片:sh.shardCollection("myDb.myCollection", {id:"hashed"})

假设有一个现有的分片数据库,Spring Data MongoDB 是否提供了一种使用分片键对集合进行分片的方法?据我所知,我无法使用 Spring 对集合进行分片,并且因此必须在我的启动应用程序运行之前配置分片集合。我觉得奇怪的是 Spring 允许我使用未定义的集合,但不提供配置集合的方法。

编辑: 我见过Sharding with spring mongoHow configuring access to a sharded collection in spring-data for mongo?,它们更多地指的是分片MongoDB 集群的部署。这个问题假设所有的管道都在那里,并且集合本身必须被分片。

【问题讨论】:

    标签: spring mongodb spring-boot spring-data-mongodb


    【解决方案1】:

    尽管这个问题很老,但我也有同样的问题,而且最近似乎没有提供自定义分片密钥。

    spring-data-mongodb:3.x 上提供了基于注释的 Shard Key 配置, 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 版本。

    【讨论】:

    【解决方案2】:

    尽管这不是 Spring Data 解决方案,但在 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);
    

    【讨论】:

      【解决方案3】:

      在我们内部使用 save() 的更新查询中遇到了同样的问题。

      怎么解决的?

      所以我现在已经覆盖了 spring-boot-starter 中的 spring-data-mongo 核心依赖项,在我们现在支持 @Sharded() 注释的模型中,它是 2.1.x 到 3.x 版本。

      <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 {
      

      which 内部现在能够告诉底层 mongo 哪个是我们的 shardkey。我假设这将进一步修复我们的 count() 查询也由于相同的错误“查询需要以分片为目标”而失败

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 2013-08-31
        • 2018-12-15
        • 1970-01-01
        • 2011-12-15
        • 1970-01-01
        相关资源
        最近更新 更多