如何忽略DocumentContent中的“$”以保存在MongoDB中?

问题描述 投票:0回答:1

我的问题是,如果我在内容中保存带有$的文档,Mongodb会给我一个例外:

java.lang.IllegalArgumentException:无效的BSON字段名称$ xxx

我希望mongodb忽略内容中的$字符。

我的应用程序是用java编写的。我读取了文件的内容并将其作为字符串放入对象中。之后,该对象将与MongoRepository类一起保存。

有人有什么想法?

Example content

编辑:我听说mongodb与dot有同样的问题。我们的Spring Boot发现我用dot解决了问题,但不是为了美元。

How to configure mongo converter in spring to encode all dots in the keys of map being saved in mongo db

mongodb
1个回答
0
投票

如果您使用的是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 ...
}
© www.soinside.com 2019 - 2024. All rights reserved.