Составной индекс в настоящее время не поддерживает вложенные документы или массивы в Azure Cosmos MongoDB - PullRequest
0 голосов
/ 30 марта 2020
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;
        }
    }

1 Ответ

0 голосов
/ 30 марта 2020

Вы используете неправильный метод для создания 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);
    }
...