【问题标题】:Compound index does not currently support nested documents or arrays in Azure Cosmos MongoDB复合索引当前不支持 Azure Cosmos MongoDB 中的嵌套文档或数组
【发布时间】:2020-03-30 10:48:45
【问题描述】:
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;
        }
    }

【问题讨论】:

    标签: mongodb azure spring-boot javers azure-cosmosdb-mongoapi


    【解决方案1】:

    您使用错误的方法创建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);
        }
    

    【讨论】:

    • 此解决方案适用于 Amazon DocumentDb。我正在寻找 Azure CosmosDB 的解决方案
    • 好的,我明白了,现在不支持这个 db,请参阅 javers.org/documentation/repository-configuration/… 如果它类似于 mongo,请考虑在适当的支持下向 Javers 贡献一个 PR
    • 是的,我已经在 Azure 云上创建了一个普通的 MongoDb 服务器,它现在正在运行。
    猜你喜欢
    • 2020-09-22
    • 2018-01-06
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多