Эта глава знакомит с тем, как Golang выражает структуру данных JSON в MongoDB. Как известно, данные и условия запросов MongoDB описываются с использованием структур JSON. Так как же можно выразить такие JSON-структуры на языке Go?

Пакет bson

Официальный драйвер языка Go, предоставленный MongoDB, предлагает пакет bson, который включает несколько структур данных для описания JSON.

Пакет 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
}