复合索引当前不支持Azure Cosmos MongoDB中的嵌套文档或数组


Connecting Javers API with Azure Cosmos MongoDB
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'JaversFromStarter' defined in class path resource [com/test/config/JaversMongoAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.javers.core.Javers]: Factory method 'javers' threw exception; nested exception is com.mongodb.MongoCommandException: Command failed with error 115 (CommandNotSupported): 'Compound index does not currently support nested documents or arrays.' on server azurecosommongo:10255. The full response is { "ok" : 0.0, "errmsg" : "Compound index does not currently support nested documents or arrays.", "code" : 115, "codeName" : "CommandNotSupported" }
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:627) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1305) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1144) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
... 22 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.javers.core.Javers]: Factory method 'javers' threw exception; nested exception is com.mongodb.MongoCommandException: Command failed with error 115 (CommandNotSupported): 'Compound index does not currently support nested documents or arrays.' on server azurecosommongo:10255. The full response is { "ok" : 0.0, "errmsg" : "Compound index does not currently support nested documents or arrays.", "code" : 115, "codeName" : "CommandNotSupported" }
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
... 35 common frames omitted
Caused by: com.mongodb.MongoCommandException: Command failed with error 115 (CommandNotSupported): 'Compound index does not currently support nested documents or arrays.' on server azurecosommongo:10255. The full response is { "ok" : 0.0, "errmsg" : "Compound index does not currently support nested documents or arrays.", "code" : 115, "codeName" : "CommandNotSupported" }
at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:179) ~[mongodb-driver-core-3.8.2.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:293) ~[mongodb-driver-core-3.8.2.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:255) ~[mongodb-driver-core-3.8.2.jar:na]

下面是我为支持连接而添加的配置。但我只在应用程序启动时遇到了一个例外。我可以连接到简单的MongoDB,但通过Cosmos API我得到了

复合索引当前不支持嵌套文档或数组。

@Autowired
private JaversMongoProperties javersMongoProperties;
@Autowired
private MongoDbFactory mongoDbFactory; //from spring-boot-starter-data-mongodb
@Autowired
@Qualifier("javersMongoClientOptions")
private Optional<MongoClientOptions> mongoClientOptions;
@Bean(name = "JaversFromStarter")
@ConditionalOnMissingBean
public Javers javers() {
logger.info("Starting javers-spring-boot-starter-mongo ...");
MongoDatabase mongoDatabase = initJaversMongoDatabase();
MongoRepository javersRepository = createMongoRepository(mongoDatabase);
return JaversBuilder.javers()
.registerJaversRepository(javersRepository)
.withProperties(javersMongoProperties)
.withObjectAccessHook(javersMongoProperties.createObjectAccessHookInstance())
.build();
}
private MongoDatabase initJaversMongoDatabase() {
if (!javersMongoProperties.isDedicatedMongodbConfigurationEnabled()) {
MongoDatabase mongoDatabase = mongoDbFactory.getDb();
logger.info("connecting Javers to Mongo database '{}' configured in spring.data.mongodb properties",
mongoDatabase.getName());
return mongoDatabase;
} else {
MongoDatabase mongoDatabase = JaversDedicatedMongoFactory.createMongoDatabase(javersMongoProperties, mongoClientOptions);
logger.info("connecting Javers to Mongo database '{}' configured in javers.mongodb properties",
mongoDatabase.getName());
return mongoDatabase;
}
}

您使用了错误的方法来创建MongoRepository。你应该使用这个:

/**
* MongoRepository compatible with Amazon DocumentDB.
* <br/>
*
* Compound index on <code>commitProperties</code> isn't created.
* <br/><br/>
*
* See <a href="http://docs.aws.amazon.com/documentdb/latest/developerguide/functional-differences.html">functional differences</a>.
*/
public static MongoRepository mongoRepositoryWithDocumentDBCompatibility(MongoDatabase mongo, int cacheSize) {
return new MongoRepository(mongo, cacheSize, DOCUMENT_DB);
}

最新更新