Я знаю, что название кажется общим и дублирующим, но я попробовал многие варианты из предыдущих вопросов, и Я не могу использовать структуру здесь
Моя системаиспользование службы обмена сообщениями 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)
}
Чего мне здесь не хватает?
Смотрите результат с неправильно отформатированными данными: