【问题标题】:How to specify key param order using Spring Data Mongo Mapper and composite key如何使用 Spring Data Mongo Mapper 和复合键指定键参数顺序
【发布时间】: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


    【解决方案1】:

    我发现 @Field 注释做了我需要的。在这种情况下,仅仅使用 order 参数是不够的,因为 Mongo 映射器将 id 重命名为 _id 它也将该属性放在首位。一旦我将显式持久性值参数添加为id,那么一切都会按预期工作。

    public class Key implements Serializable {
        @Field(order = 1)
        private final @NotNull String region;
        @Field(value = "id", order = 2)
        private final @NotNull String id;
        public Key(@NotNull String region, @NotNull String id) {
            this.region = region;
            this.id = id;
        }
    }
    

    这是持久化的 mongo 文档:

    { "_id" : { "region" : "us_west", "id" : "12345" } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-28
      相关资源
      最近更新 更多