Вставка JSON или карты из интерфейса map [string] {} в коллекцию MongoDB задает целые и плавающие как строки - PullRequest
0 голосов
/ 18 февраля 2019

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

Моя системаиспользование службы обмена сообщениями NATS для отправки карт между подписчиком и издателем.Подписчик берет полученную карту и вставляет ее в качестве документа в коллекцию MongoDB

Проблема, с которой я столкнулся, заключается в том, что числа с плавающей запятой и целые числа вставляются в виде строк!

В моем коде recipe - это файл конфигурации, который устанавливает типы данных столбцов, полученных на карте.Думайте об этом как о последовательности клавиш, подобных этой:

  • Строковый столбец: «строка»,
  • Int столбец: «int»

Воткод, который создает карту с правильными типами данных

mapWithCorrectDataTypes := make(map[string]interface{})

    for columnNameFromDataTypesInRecipe, datatypeForColumnInRecipe := range dataTypesFromRecipeForColumns {

    for natsMessageColumn, natsMessageColumnValue := range mapFromNATSMessage {

            //If the column in the NATS message is found in the recipe, format the data as dictated in the recipe
                    if natsMessageColumn == columnNameFromDataTypesInRecipe {

                        if datatypeForColumnInRecipe.(string) == "string" {

                            natsMessageColumnValue = natsMessageColumnValue.(string)
                            mapWithCorrectDataTypes[columnNameFromDataTypesInRecipe] = natsMessageColumnValue
                        }

                        if datatypeForColumnInRecipe.(string) == "int" {

                            convertedInt, err := strconv.Atoi(mapFromNATSMessage[columnNameFromDataTypesInRecipe].(string))
                            if err != nil {
                                fmt.Println("ERROR -->", err)
                            }
                            mapWithCorrectDataTypes[columnNameFromDataTypesInRecipe] = convertedInt
                        }

                        if datatypeForColumnInRecipe.(string) == "float64" {

                            convertedFloat, err := strconv.ParseFloat(mapFromNATSMessage[columnNameFromDataTypesInRecipe].(string), 64)

                            if err != nil {
                                fmt.Println("ERROR -->", err)
                            }
                            mapWithCorrectDataTypes[columnNameFromDataTypesInRecipe] = convertedFloat

                            fmt.Println("TYPE -->", reflect.TypeOf(mapWithCorrectDataTypes[columnNameFromDataTypesInRecipe]))
                        }
                    } else {
                        //If column not found in the recipe, format as a string
                        mapWithCorrectDataTypes[natsMessageColumn] = natsMessageColumnValue.(string)
                    }
                }
            }

Из последней строки я вставил оператор печати для float64s, чтобы проверить, что тип данных для этого ключа в карте является правильным, и он проходит этот тест!


У меня такой вопрос: Если типы данных правильно устанавливаются на карте, почему при вставке карты в качестве документа в MongoDB значения типа float и int задаются как строки ?!

То, что я пробовал до сих пор:

Выделение и демаршалирование карты как интерфейса, затем вставка записи:

        jsonVersionOfMap, err := json.Marshal(mapWithCorrectDataTypes)

        if err != nil {
            fmt.Println("ERROR -->", err)
        }

        var interfaceForJSON interface{}

        json.Unmarshal(jsonVersionOfMap, &interfaceForJSON)

        fmt.Println("JSON -->", interfaceForJSON)
        err = mongoConnection.Insert(interfaceForJSON)

        if err != nil {
            fmt.Println("Error inserting MongoDB documents", err)
        }

Чего мне здесь не хватает?

Смотрите результат с неправильно отформатированными данными:

enter image description here

1 Ответ

0 голосов
/ 19 февраля 2019

это не может быть исправлением.Но я решил проблему, с которой столкнулся.Я использую издателя и подписчика через NATS.Ранее я создавал карту со всеми данными, затем отправлял ее в виде сообщения, а затем подписчик извлекает карту из сообщения и обрабатывает типы данных (на стороне подписчика)

.Я испытывал . Вместо этого я отформатировал значения карт на стороне издателя .Поэтому я вместо этого перенес свой код, проверяющий тип данных, на издателя NATS, а не код, который обрабатывает входящее сообщение

. Я понимаю, что это не идеальное решение, но если вы используете NATS иобнаружить, что у вас та же проблема.Попробуйте это

...