如何使用Spring Data Mongo Mapper和复合键指定键参数顺序

时间:2018-09-25 00:54:26

标签: java spring mongodb spring-data spring-data-mongodb

我有一个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" } }

当我期望这样做时(由于数据库分片而至关重要):

{ "_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声明顺序,这是我最初希望发生的事情?

1 个答案:

答案 0 :(得分:0)

我发现printf注释完成了我所需要的。在这种情况下,仅使用 printf("%s", rand_word(ARRAY_LEN(WORDS), WORDS)); 参数是不够的,因为由于Mongo映射器将@Field重命名为order,因此它也首先放置了该属性。一旦将显式持久性值参数添加为id,一切都会按预期进行。

_id

这是持久的mongo文档:

id