Сохранить точки '.' в ключе как поле в MongoDB с использованием SpringBoot

У меня есть данные json, где ключ содержит точки как «123.456» и значение как объект.

  {
        "models": {
            "123.456": [{
                "key1": "value1",
                "key2": "value2"
            }]
        }
    }

Я получаю исключение сопоставления при попытке сохранить объект в MongoDB следующим образом

org.springframework.data.mapping.model.MappingException: Map key 123.456 contains dots but no replacement was configured!Make sure map keys don't contain dots in the first place or configure an appropriate replacement!

Есть ли поддержка сохранения ключа в виде поля, содержащего точки в Spring Mongo?


person shashank    schedule 09.10.2019    source источник


Ответы (1)


Вы должны использовать класс MappingMongoConverter. Он имеет метод setMapKeyDotReplacement(String mapKeyDotReplacement).

Согласно Документы Spring-MongoDB:

Метод setMapKeyDotReplacement(String mapKeyDotReplacement) проверяет, присутствуют ли точки на карте или нет. Если он найден, то его следует заменить на указанный символ.

Пример того, как его использовать:

@Component
public class Example {

    @Autowired
    private MappingMongoConverter mappingMongoConverter;

    public void replaceKeyContainingDot() {
      mappingMongoConverter.setMapKeyDotReplacement("pass here the character you want to replace the dots with");
    }

} 

Примечание. Из документов MongoDB:

Использование $ и . в именах полей не рекомендуется и не поддерживается официальными драйверами MongoDB.

Есть обходной путь, который я нашел в документации. Возможно, вам придется переопределить методы potentiallyEscapeMapKey(String source) и potentiallyUnescapeMapKey(String source) из класса MappingMongoCoverter.

Пожалуйста, обратитесь к этим популярным вопросам SO здесь для получения дополнительной информации и лучшего понимания:

  1. Как настроить MappingMongoConverter (setMapKeyDotReplacement) в Spring-Boot без нарушения автоконфигурация?

  2. Точки MongoDB-Escape '.' в ключе карты

person Anish B.    schedule 09.10.2019
comment
Но я не хочу заменять точки, вместо этого я хотел бы сохранить точки как есть, и когда я использовал mongoMappingConverter.setMapKeyDotReplacement(.), я получаю исключение Invalid bson field dot. - person shashank; 10.10.2019
comment
Из документации mongo db использование $ и . в именах полей не рекомендуется и не поддерживается официальными драйверами MongoDB. - person Anish B.; 10.10.2019
comment
Mongo 3.6 позволяет использовать точки и знаки доллара в именах полей docs.mongodb.com/manual/core/ документ - person shashank; 10.10.2019
comment
@shashank Итак, вы используете MongoDB 3.6? - person Anish B.; 10.10.2019
comment
@shashank Смотрите это: stackoverflow.com/questions/12397118/ mongodb-dot-in-key-name - person Anish B.; 10.10.2019
comment
@shashank Обходной путь есть, но я не уверен. Найдите способ переопределить метод potentiallyEscapeMapKey(String source ). - person Anish B.; 10.10.2019
comment
да, я просматривал документацию и подумал о том, чтобы попробовать этот метод потенциальноEscapeMapKey(.) - person shashank; 10.10.2019