Вот возможное решение для декодирования этого строкового поля как int в вашей структуре, обрабатывающего как строковые, так и int поля.
Я использовал следующую структуру для этого примера:
type Obj struct {
Field1 string `bson:"field1"`
IntField int `bson:"intField"`
}
И вставил следующие документы (обратите внимание, что второй do c со строковым полем как "intField": "2"
):
db.s2i.insertOne({"field1": "value", "intField": 3})
db.s2i.insertOne({"field1": "value2", "intField": "2"})
Использование оператора $ toInt из структуры агрегирования, например, так:
pipeline := []bson.M{bson.M{"$match": bson.M{}}, bson.M{"$project": bson.M{"field1": 1, "intField": bson.M{"$toInt": "$intField"}}}}
cur, err := client.Database("stack").Collection("s2i").Aggregate(context.TODO(), pipeline)
for cur.Next(context.TODO()) {
var res *Obj
err = cur.Decode(&res)
fmt.Println(res, err)
fmt.Println("Value of res.IntField:")
fmt.Println(res.IntField)
fmt.Println("Type of res.IntField:")
fmt.Println(reflect.TypeOf(res.IntField))
}
Возвращает следующие документы с «2», декодированным как int:
&{value 3} <nil>
Value of res.IntField:
3
Type of res.IntField:
int
&{value2 2} <nil>
Value of res.IntField:
2
Type of res.IntField:
int