使用Spring Data MongoDB指定Sharded Collection

时间:2017-11-28 18:31:35

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

我正在使用Spring Boot和Spring Data MongoDB与底层的分片MongoDB集群进行交互。我的Spring Boot应用程序通过#!/bin/bash function press_enter { echo "" echo -n "Press Enter to continue" read clear } selection= where_selection= what_selection= until [ "$selection" = "3" ]; do echo -e "Where would you like to search 1- Root 2- Home 3- Exit Enter your choice ---> \c" read selection case $selection in 1) cd / ; press_enter ;; 2) cd /home ; press_enter ;; 3) echo "Have a great day!" ; exit ;; esac echo "What is the name of the file you would like to search for?" read -r a if find . -name "$a" -print -quit | grep -q . then echo "You found the file" else echo "You haven't found the file" fi done 路由器访问集群。

使用Spring Data MongoDB,您可以通过mongos指定对象持久保存的集合,或者默认为类名(首字母小写)。这些集合不需要事先存在;它们可以在运行时创建。

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

1 - 在数据库上启用分片:@Document(collection = "nameOfCollection")

2 - 在分片数据库中对集合进行分片:sh.enableSharding("myDb")

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

修改 我已经看到Sharding with spring mongoHow configuring access to a sharded collection in spring-data for mongo?都更多地引用了分片MongoDB集群的部署。这个问题假设所有的管道都存在,并且集合本身必须简化为分片。

3 个答案:

答案 0 :(得分:2)

尽管这个问题很旧,但我也遇到了同样的问题,而且自最近以来似乎已经可以提供自定义分片密钥了。

基于注释的分片键配置在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版本。

答案 1 :(得分:1)

即使这不是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);

答案 2 :(得分:0)

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

怎么解决的?

所以我现在已经覆盖了 spring-boot-starter 的 spring-data-mongo 核心依赖项,它是我们模型中的 2.1.x 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() 查询,这些查询由于相同的错误“查询需要定位分片”而失败