Pular para o conteúdo

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

  1. Cole a consulta, o filtro ou o documento como JSON estrito (chaves entre aspas, sem helpers do shell como ObjectId(...) ou ISODate(...)).
  2. Copie o literal bson.M{...} do painel Go; operadores como $gte, $in e $or são mantidos como chaves string.
  3. 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.

Especificações e referências