この章では、GolangがMongoDBのJSONデータ構造をどのように表現するかを紹介します。皆さんもご存知のように、MongoDBのデータとクエリ条件はJSON構造を使用して記述されます。では、Go言語でどのようにしてこのようなJSON構造を表現することができるのでしょうか?

bsonパッケージ

MongoDBが提供する公式のGo言語ドライバには、JSONデータを記述するためのいくつかのデータ構造が含まれたbsonパッケージがあります。

bsonパッケージ: go.mongodb.org/mongo-driver/bson

bson.D型は、順序付きのキーと値の配列を記述するために使用され、これはMongoDBのクエリ式とJSONデータを表現する際に一般的に使用されます。

定義:

// キー-バリュー形式の配列
type D [] E

// キー-バリュー構造
type E struct {
	Key   string
	Value interface{}
}

クエリ式の例:

bson.D{{"qty", bson.D{{"$lt", 30}}}}

等価な式:

{"qty": {"$lt": 30} }

ドキュメントデータの例:

bson.D{
	{"item", "journal"},
	{"qty", 25},
	{"size", bson.D{
		{"h", 14},
		{"w", 21},
		{"uom", "cm"},
	}},
	{"status", "A"},
}

等価なJSON:

{
	"item": "journal",
	"qty": 25,
	"size": {
		"h": 14,
		"w": 21,
		"uom": "cm"
	},
	"status": "A"
}

bson.Aは、JSON配列を定義するために使用されます。

JSON配列の定義:

type A []interface{}

例1:

bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}}

等価なJSON:

["bar", "world", 3.14159, {"qux": 12345}]

例2:

bson.A{"A", "D"}

等価なJSON:

["A", "D"]

bson.Mは、順序のないキーと値のペアを記述するために使用され、bson.Dとは異なり、キーの保存順序には関心がありません。

定義:

type M map[string]interface{}

例:

bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}

等価なJSON:

{
	"foo": "bar",
	"hello": "world",
	"pi": 3.14159
}