为不同集合中的子文档和父文档中的相同字段独立定义索引

时间:2016-06-13 19:42:02

标签: spring-data spring-data-mongodb

我有两个看起来像这样的类:

@Document(collection = 'rule')
class Rule {
    @Indexed(unique = true)
    String name
}

@Document(collection = 'archived_rule')
class ArchivedRule extends Rule {
    @Indexed(unique = false)
    String name
}

规则是我的应用程序使用的主要域类。每个规则的最新版本都存储在“规则”集合中。更新规则时,会制作一份规则副本并保存在“archived_rule”集合中。

“规则”集合中的名称字段应该是唯一的。它应该能够在'archived_rule'集合中重复。

如上所述定义我的课程似乎不起作用。当我启动我的应用程序时,我得到一个像这样的例外:

Caused by: org.springframework.data.mapping.model.MappingException: Ambiguous field mapping detected! Both @org.springframework.data.mongodb.core.index.Indexed(expireAfterSeconds=-1, dropDups=false, sparse=false, useGeneratedName=false, background=false, unique=true, name=, collection=, direction=ASCENDING) private java.lang.String ...Rule.name and @org.springframework.data.mongodb.core.index.Indexed(expireAfterSeconds=-1, dropDups=false, sparse=false, useGeneratedName=false, background=false, unique=false, name=, collection=, direction=ASCENDING) private java.lang.String ...ArchivedRule.name map to the same field name name! Disambiguate using @Field annotation!

我还尝试过在ArchivedRule类中根本没有指定名称字段,但在这种情况下,它会在'archived_rule'集合的'name'字段中创建一个唯一索引。

我认为我可以通过继承使Rule和ArchivedRule无关,然后显式重新定义我需要从ArchivedRule中的Rule保存的所有字段。不过,我想避免这样做。

我是否有其他方法可以指定我的类,以便Rule.name具有唯一索引,而ArchivedRule.name没有唯一索引?

1 个答案:

答案 0 :(得分:0)

我能够通过添加一个抽象基类来解决这个问题,该基类具有Rule和ArchivedRule都扩展自的名称之外的共享字段。然后,它们各自使用适当的索引配置定义自己的名称版本。

class RuleBase {
    String sharedField
}

@Document(collection = 'rule')
class Rule extends RuleBase {
    @Indexed(unique = true)
    String name
}

@Document(collection = 'archived_rule')
class ArchivedRule extends RuleBase {
    @Indexed(unique = false)
    String name
}