我正在使用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 mongo和How configuring access to a sharded collection in spring-data for mongo?都更多地引用了分片MongoDB集群的部署。这个问题假设所有的管道都存在,并且集合本身必须简化为分片。
答案 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() 查询,这些查询由于相同的错误“查询需要定位分片”而失败