我正在使用带有Groovy的MongoDB Spring Data Framework,无法解决我的问题: 我想要的:我希望Spring Data用2个索引创建我的MongoDB集合。我有我的POJO课程
@Document(collection='language')
class language {
@Id
String Id
@Indexed(unique = true)
String isoCode
String description
}
这是我的存储库:
public interface LanguageRepository extends MongoRepository<Language, String>
List<Language> findByisoCode(String isoCode);
}
也许还有一些注释,我正在编写代码而没有我的源代码......
我编写了一个spock测试,用于检查是否可以使用相同的isoCode插入两种语言并且需要一个例外。 Spock测试连接应用程序上下文并且工作得很好,除了一点:第一次运行测试时不会创建索引。
我连接我的测试,测试将具有相同isoCode的twi语言插入到MongoDB中,测试失败,因为没有索引可以防止重复的isoCodes。我也可以在MongoShell中看到这一点。测试失败,因为没有索引违规且没有异常。 现在,当我再次运行相同的测试时,我的应用程序甚至无法启动,因为Spring Data似乎在我的MongoDB上创建索引 - 但这也失败了,因为数据库中已经有重复的条目并且索引的创建失败了(当然...)。当我通过MongoShell手动删除其中一个条目并再次运行相同的测试时,一切正常,因为可以创建索引并获得我预期的异常。
有人可以告诉我mongoDB是否以及为什么只有在集合中已有条目时才能创建索引?如果是这样的话:我该如何最好地处理这个问题呢?
亲切的问候 塞巴斯蒂安
编辑Spock测试:
def 'There must not be duplicate languages'() {
setup:
Language lang1 = new Language(
isoCode: 'de-DE',
description: 'Deutsch (Deutschland)'
)
Language lang2 = new Language(
isoCode: 'de-DE',
description: 'Deutsch (Schweiz)'
)
languageRepository.save(lang1)
when:
languageRepository.save(lang2)
then:
final org.springframework.dao.DuplicateKeyException ex = thrown()
cleanup:
languageRepository.deleteAll()
}