Перейти к содержимому

Преобразование 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 в тесте.

Как пользоваться

  1. Вставьте запрос, фильтр или документ в строгом JSON (ключи в кавычках, без shell-хелперов ObjectId(...) или ISODate(...)).
  2. Скопируйте литерал bson.M{...} из панели Go; операторы вроде $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

Можно ли вставить запрос mongosh с ObjectId() или ISODate()?

Нет. Ввод должен быть валидным JSON, поэтому shell-хелперы вызывают ошибку разбора. Используйте обычные строки, а затем замените их в Go на ObjectID из hex (primitive.ObjectIDFromHex в драйвере v1) или значение time.Time.

Генерирует ли он структуры Go?

Нет, только литералы map и slice. Для типизированных структур с тегами json используйте страницу JSON to Go.

Обязательно ли корень должен быть объектом?

Нет. Корневой массив становится bson.A{...}, что подходит для пайплайна агрегации, где каждая стадия — bson.M.

Спецификации и справка