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 のインラインリテラルとして書く。
使い方
- クエリ、フィルター、ドキュメントを厳密な JSON で貼り付けます(キーは引用符で囲み、ObjectId(...) や ISODate(...) などのシェルヘルパーは使いません)。
- Go パネルから bson.M{...} リテラルをコピーします。$gte、$in、$or などの演算子は文字列キーのまま残ります。
- 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 である集計パイプラインに適しています。