Как можно игнорировать «$» в DocumentContent для сохранения в MongoDB? - PullRequest
0 голосов
/ 18 сентября 2018

Моя проблема в том, что если я сохраняю документ с $ внутри содержимого, Mongodb выдает мне исключение:

java.lang.IllegalArgumentException: Неверное имя поля BSON $ xxx

Мне бы хотелось, чтобы mongodb игнорировал символ $ в содержимом.

Мое приложение написано на Java.Я прочитал содержимое файла и поместил его в виде строки в объект.После этого объект будет сохранен с классом MongoRepository.

У кого-то есть идеи ??

Пример содержимого

Редактировать: Я слышал, что у mongodb естьта же проблема с точкой.Наш Springboot нашел обходной путь с точкой, но не для доллара.

Как сконфигурировать конвертер монго весной для кодирования всех точек в ключах карты, сохраняемых в mongo db

1 Ответ

0 голосов
/ 15 октября 2018

Если вы используете Spring Boot, вы можете расширить класс MappingMongoConverter и добавить методы переопределения, которые выполняют экранирование / удаление.

@Component
public class MappingMongoConverterCustom extends MappingMongoConverter {

    protected @Nullable
    String mapKeyDollarReplacemant = "characters_to_replace_dollar";

    protected @Nullable
    String mapKeyDotReplacement = "characters_to_replace_dot";

    public MappingMongoConverterCustom(DbRefResolver dbRefResolver, MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext) {
        super(dbRefResolver, mappingContext);
    }

    @Override
    protected String potentiallyEscapeMapKey(String source) {
        if (!source.contains(".") && !source.contains("$")) {
            return source;
        }

        if (mapKeyDotReplacement == null && mapKeyDollarReplacemant == null) {
            throw new MappingException(String.format(
                    "Map key %s contains dots or dollars but no replacement was configured! Make "
                            + "sure map keys don't contain dots or dollars in the first place or configure an appropriate replacement!",
                    source));
        }

        String result = source;
        if(result.contains(".")) {
            result = result.replaceAll("\\.", mapKeyDotReplacement);
        }
        if(result.contains("$")) {
            result = result.replaceAll("\\$", mapKeyDollarReplacemant);
        }
        
        //add any other replacements you need

        return result;
    }

    @Override
    protected String potentiallyUnescapeMapKey(String source) {
        String result = source;
        if(mapKeyDotReplacement != null) {
            result = result.replaceAll(mapKeyDotReplacement, "\\.");
        }
        if(mapKeyDollarReplacemant != null) {
            result = result.replaceAll(mapKeyDollarReplacemant, "\\$");
        }
        
         //add any other replacements you need
        return result;
    }
}

Если вы используете этот подход, убедитесь, что вы переопределяете конвертер по умолчанию из AbstractMongoConfiguration, как показано ниже:

@Configuration
public class MongoConfig extends AbstractMongoConfiguration{

@Bean
public DbRefResolver getDbRefResolver() {
    return new DefaultDbRefResolver(mongoDbFactory());
}

@Bean
@Override
public MappingMongoConverter mappingMongoConverter() throws Exception {
    MappingMongoConverterCustom converter = new MappingMongoConverterCustom(getDbRefResolver(), mongoMappingContext());
    converter.setCustomConversions(customConversions());

    return converter;
}

   .... whatever you might need extra ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...