Converter JSON em estruturas Go com BSON — Numio
Reescreve um documento JSON como um literal Go construído com bson.M (objetos) e bson.A (arrays) para o driver Go do MongoDB, com as vírgulas finais que o Go exige. As chaves mantêm a ordem, null vira nil e as strings são copiadas sem alteração.
Levar para código Go uma consulta ou filtro do MongoDB testado no mongosh ou no Compass.
JSON
Go Bson
Quando usar
- Levar para código Go uma consulta ou filtro do MongoDB testado no mongosh ou no Compass.
- Escrever um estágio de agregação ou um documento de update como literal Go inline em um teste.
Como usar
- Cole a consulta, o filtro ou o documento como JSON estrito (chaves entre aspas, sem helpers do shell como ObjectId(...) ou ISODate(...)).
- Copie o literal bson.M{...} do painel Go; operadores como $gte, $in e $or são mantidos como chaves string.
- Importe go.mongodb.org/mongo-driver/bson e passe o valor para Find, UpdateOne ou Aggregate, ajustando os tipos conforme as notas abaixo.
Entrada JSON
{
"status": "active",
"deletedAt": null,
"age": { "$gte": 18 },
"tags": { "$in": ["go", "mongo"] },
"$or": [
{ "verified": true },
{ "score": { "$gt": 90 } }
]
}Go bson.M / bson.A
bson.M{
"status": "active",
"deletedAt": nil,
"age": bson.M{
"$gte": 18,
},
"tags": bson.M{
"$in": bson.A{
"go",
"mongo",
},
},
"$or": bson.A{
bson.M{
"verified": true,
},
bson.M{
"score": bson.M{
"$gt": 90,
},
},
},
}Detalhes e limitações
O JSON é analisado e percorrido no navegador para montar o literal; nada é enviado a um servidor.
null vira nil. Os números são constantes Go sem tipo, então 18 vira int e 1.5 vira float64; inteiros acima de 2^53 perdem precisão no parse do JSON.
As strings são escritas como literais string do Go, então colchetes ou chaves dentro delas, como "tags[0]", não são alterados.
A saída é bson.M, que não tem ordem. Use bson.D quando a ordem dos campos importar, como em documentos de ordenação ou alguns estágios de pipeline.
FAQ
Posso colar uma consulta do mongosh com ObjectId() ou ISODate()?
Não. A entrada precisa ser JSON válido, então helpers do shell causam erro de parse. Use strings simples e depois substitua-as no Go por um ObjectID a partir de hex (primitive.ObjectIDFromHex no driver v1) ou por um valor time.Time.
Ele gera structs Go?
Não, só produz literais de map e slice. Para structs tipadas com tags json, use a página JSON para Go.
A raiz precisa ser um objeto?
Não. Um array na raiz vira bson.A{...}, o que serve para um pipeline de agregação, em que cada estágio é um bson.M.