我使用Spring和Spring与底层的切分MongoDB集群进行接口。我的通过mongos
路由器访问集群。
使用Spring,您可以通过@Document(collection = "nameOfCollection")
指定对象被持久化到的集合,或者它默认为类名(第一个字母小写)。这些集合不需要预先存在;它们可以在运行时创建。
要在MongoDB中分割集合,您需要
1-启用数据库上的切分:sh.enableSharding("myDb")
2-在切分数据库上分割集合:sh.shardCollection("myDb.myCollection", {id:"hashed"})
假设有一个现有的切分数据库, Data MongoDB是否提供了一种使用碎片键分割集合的方法?据我所知,我不能用Spring分割集合,因此必须在启动应用程序运行之前配置这个切分集合。我感到奇怪的是,Spring允许我使用未定义的集合,但没有提供配置集合的方法。
编辑:--我看到了Sharding with spring mongo和How configuring access to a sharded collection in spring-data for mongo?,它们更多地提到了一个切分MongoDB集群的部署。这个问题假定所有的管道都在那里,并且集合本身必须被分割。
发布于 2020-04-01 11:02:42
尽管这个问题已经很老了,但我还是遇到了同样的问题,似乎从最近开始就有了提供自定义切分键的方法。
基于注释的碎片密钥配置可在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版本。
发布于 2017-11-28 18:47:33
尽管这不是一个Spring数据解决方案,但在how to execute mongo admin command from java中提供了一个潜在的解决方案,在这里,可以从SpringMongoTemplate
中获取DB
。
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);
发布于 2021-03-19 18:26:27
在内部使用save()的update查询中遇到了相同的问题。
它是怎么解决的?
因此,我现在已经重写了核心依赖于spring 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 {
在内部,它现在能够告诉潜在的芒果,这是我们的锋利钥匙。我假设这将进一步修正count()查询,这些查询由于同样的错误“查询需要针对碎片”而失败。
https://stackoverflow.com/questions/47538573
复制相似问题