本文へスキップ

JSONをGo Bsonに変換 — Numio

JSON ドキュメントを、MongoDB Go ドライバー用に bson.M(オブジェクト)と bson.A(配列)で組み立てた Go のリテラルに書き換えます。Go が必要とする末尾のカンマも付きます。キーの順序は保たれ、null は nil になり、文字列はそのままコピーされます。

mongosh や Compass で試した MongoDB のクエリやフィルターを Go のコードに移す。

JSON

Go Bson

こんなときに使えます

  • mongosh や Compass で試した MongoDB のクエリやフィルターを Go のコードに移す。
  • テスト内で集計ステージや更新ドキュメントを Go のインラインリテラルとして書く。

使い方

  1. クエリ、フィルター、ドキュメントを厳密な JSON で貼り付けます(キーは引用符で囲み、ObjectId(...) や ISODate(...) などのシェルヘルパーは使いません)。
  2. Go パネルから bson.M{...} リテラルをコピーします。$gte、$in、$or などの演算子は文字列キーのまま残ります。
  3. go.mongodb.org/mongo-driver/bson をインポートし、値を Find、UpdateOne、Aggregate に渡します。型は下の注意に従って調整してください。

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

仕様と制限

JSON はブラウザ内で解析・走査されてリテラルが組み立てられ、サーバーには何も送信されません。

null は nil になります。数値は型なしの Go 定数なので、18 は int、1.5 は float64 になります。2^53 を超える整数は JSON の解析時に精度が失われます。

文字列は Go の文字列リテラルとして書き出されるため、"tags[0]" のように中に含まれる角かっこや波かっこはそのまま残ります。

出力は順序を持たない bson.M です。ソートドキュメントや一部のパイプラインステージなど、フィールドの順序が重要な場合は bson.D を使ってください。

FAQ

ObjectId() や ISODate() を含む mongosh のクエリを貼り付けられますか?

できません。入力は有効な JSON である必要があり、シェルヘルパーは解析エラーになります。普通の文字列で入力し、Go 側で hex から作った ObjectID(ドライバー v1 では primitive.ObjectIDFromHex)や time.Time の値に置き換えてください。

Go の struct は生成されますか?

いいえ。生成されるのは map と slice のリテラルだけです。json タグ付きの型付き struct が必要な場合は JSON → Go を使ってください。

ルートはオブジェクトでなければいけませんか?

いいえ。ルート配列は bson.A{...} になり、各ステージが bson.M である集計パイプラインに適しています。

仕様を確認する