我知道标题似乎是通用名称和重复名称,但我已经尝试了前面问题中的许多选项,并且我不能在此处使用结构
我的系统正在使用消息传递服务NATS在订阅者和发布者之间发送地图。订阅者获取接收到的地图,并将其作为文档插入到MongoDB集合中
我的问题是浮点数和整数作为字符串插入!
在我的代码中, recipe 是一个配置文件,用于设置映射中接收到的列的数据类型。可以将其视为一系列这样的键:
以下是使用正确的数据类型创建地图的代码
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中的文档插入时将浮点数和整数设置为字符串?! >
到目前为止,我已经尝试过:
将地图编组和解组为接口,然后插入记录:
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)
}
我在这里想念什么?
查看格式错误的数据的结果:
答案 0 :(得分:0)
这可能不是解决方法。但是我已经解决了我遇到的问题。我正在通过NATS使用发布者和订阅者。以前,我是用所有数据创建一个地图,然后将其作为消息发送出去,然后订户从消息中获取该图,并处理数据类型(在订户端)
为解决我遇到的问题,我改为在发布者一侧设置了地图的值格式。因此,我将检查数据类型的代码移到了NATS发布者上,而不是将处理传入消息的代码移到了
我知道这不是理想的解决方案,但是如果您使用的是NATS,但发现同样的问题。试试这个