Преобразование JSON в структуры Go с тегами BSON — Numio
Переписывает JSON-документ в литерал Go из bson.M (объекты) и bson.A (массивы) для Go-драйвера MongoDB, с обязательными в Go завершающими запятыми. Порядок ключей сохраняется, null становится nil, строки копируются без изменений.
Перенести в код Go запрос или фильтр MongoDB, проверенный в mongosh или Compass.
JSON
Go Bson
Когда пригодится
- Перенести в код Go запрос или фильтр MongoDB, проверенный в mongosh или Compass.
- Записать стадию агрегации или документ обновления как встроенный литерал Go в тесте.
Как пользоваться
- Вставьте запрос, фильтр или документ в строгом JSON (ключи в кавычках, без shell-хелперов ObjectId(...) или ISODate(...)).
- Скопируйте литерал bson.M{...} из панели Go; операторы вроде $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
Можно ли вставить запрос mongosh с ObjectId() или ISODate()?
Нет. Ввод должен быть валидным JSON, поэтому shell-хелперы вызывают ошибку разбора. Используйте обычные строки, а затем замените их в Go на ObjectID из hex (primitive.ObjectIDFromHex в драйвере v1) или значение time.Time.
Генерирует ли он структуры Go?
Нет, только литералы map и slice. Для типизированных структур с тегами json используйте страницу JSON to Go.
Обязательно ли корень должен быть объектом?
Нет. Корневой массив становится bson.A{...}, что подходит для пайплайна агрегации, где каждая стадия — bson.M.