Saltar al contenido

Convertir JSON a estructuras Go para BSON — Numio

Reescribe un documento JSON como un literal de Go construido con bson.M (objetos) y bson.A (arrays) para el driver de MongoDB para Go, con las comas finales que exige Go. Las claves conservan su orden, null pasa a nil y las cadenas se copian sin cambios.

Pasar a código Go una consulta o filtro de MongoDB probado en mongosh o Compass.

JSON

Go Bson

Cuándo usarla

  • Pasar a código Go una consulta o filtro de MongoDB probado en mongosh o Compass.
  • Escribir una etapa de agregación o un documento de actualización como literal de Go en línea dentro de un test.

Cómo usarla

  1. Pega la consulta, el filtro o el documento como JSON estricto (claves entre comillas, sin helpers de shell como ObjectId(...) o ISODate(...)).
  2. Copia el literal bson.M{...} del panel de Go; los operadores como $gte, $in y $or se mantienen como claves de tipo string.
  3. Importa go.mongodb.org/mongo-driver/bson y pasa el valor a Find, UpdateOne o Aggregate, ajustando los tipos según se indica abajo.

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,
      },
    },
  },
}

Detalles y limitaciones

El JSON se parsea y se recorre en el navegador para construir el literal; no se envía nada a ningún servidor.

null pasa a nil. Los números son constantes de Go sin tipo, así que 18 pasa a int y 1.5 a float64; los enteros mayores que 2^53 pierden precisión al parsear el JSON.

Las cadenas se escriben como literales string de Go, así que los corchetes o llaves que contengan, como "tags[0]", no se tocan.

La salida es bson.M, que no tiene orden. Usa bson.D cuando importe el orden de los campos, como en documentos de ordenación o algunas etapas de pipeline.

FAQ

¿Puedo pegar una consulta de mongosh con ObjectId() o ISODate()?

No. La entrada debe ser JSON válido, así que los helpers de shell provocan un error de parseo. Usa cadenas simples y luego sustitúyelas en Go por un ObjectID a partir de hex (primitive.ObjectIDFromHex en el driver v1) o por un valor time.Time.

¿Genera structs de Go?

No, solo produce literales de map y slice. Para structs tipados con tags json usa la página JSON a Go.

¿La raíz tiene que ser un objeto?

No. Un array en la raíz pasa a bson.A{...}, lo que encaja con un pipeline de agregación, donde cada etapa es un bson.M.

Especificaciones y referencias