【发布时间】:2018-09-25 00:54:26
【问题描述】:
我有一个 POJO,我想使用复合键来支持多区域 mongo 分布,其中首先在区域上进行分片,然后在对象 ID 上进行分片。为此,我创建了以下 POJO:
@Document("users")
public class User {
@Id
private Key id;
... // other irrelevant fields + getters/setters
}
Key 类如下所示:
// Note the order of fields is region, then id
public class Key implements Serializable {
private final @NotNull String region;
private final @NotNull String id;
public Key(@NotNull String region, @NotNull String id) {
this.region = region;
this.id = id;
}
}
不幸的是,当 Spring Data 映射器将其转换为文档时,会产生以下结果:
{ "_id" : { "_id" : "12345", "region" : "us_west" } }
当我期待这个时(由于 db 分片至关重要):
{ "_id" : { "region" : "us_west", "_id" : "12345" } }
我观察到的一件事是,映射器似乎将任何标题为“id”的 Java 字段转换为“_id”并自动将它们移动到第一位。如果可能的话,这正是我想防止的。我发现的一种解决方法是将密钥的第二部分重命名为“id2”,如下所示:
public class Key implements Serializable {
private final @NotNull String region;
private final @NotNull String id2;
public Key(@NotNull String region, @NotNull String id2) {
this.region = region;
this.id2 = id2;
}
}
这给了我一个可行的解决方案,结果是:
{ "_id" : { "region" : "us_west", "id2" : "12345" } }
...但是理想情况下,我不想重命名字段,因为它会影响我的代码的其他区域,所以我想知道是否有一种方法可以使用注释来指定映射器的字段顺序,或者执行 POJO 声明命令,这是我最初期望发生的?
【问题讨论】:
标签: java spring mongodb spring-data spring-data-mongodb