Подтвердить что ты не робот

Смешение Java MongoDB/BSON

Я пытаюсь понять реализацию BSON, используемую драйвером Java MongoDB (официальный асинхронный, в случае, если это важно).

Однако я полностью застрял в классах, представляющих документы BSON. Я концентрируюсь на "нормальных", игнорируя теперь такие функции, как ленивая конструкция. До сих пор я нашел:

  • BasicBSONObject
  • BsonDocument
  • Документ
  • BSONObject, интерфейс, реализованный BasicBSONObject, но не остальные

Я также обнаружил, что драйвер MongoDB по умолчанию возвращает свои результаты как экземпляры документа и может быть изменен для возврата BsonDocument. OTOH, класс JSON хочет вернуть DBObject, который реализуется BasicDBObject, расширяет BasicBSONObject.

Как связаны эти классы? Какой из них следует использовать в этом случае?

При написании кода, который принимает документ BSON в качестве параметра или возвращает его, какой тип я должен использовать? На самом деле это вопрос, который меня больше всего интересует, но указанные ограничения, по-видимому, противоречат.

4b9b3361

Ответ 1

До версии 3.0 все документы BSON были представлены как экземпляры BSONObject, интерфейса в пакете org.bson. API-интерфейс драйвера (DBCollection и т.д.) Дополнительно наложил требуемый DBObject, суб-интерфейс BSONObject. Большинство пользователей драйвера полагались на BasicDBObject как на конкретный класс, реализующий DBObject.

Кроме того, класс JSON, который анализирует и сериализует JSON, производит и ожидает экземпляры DBObject.

В новом драйвере CRUD API (MongoCollection) роль, которую DBObject играет в DBCollection, была разделена.

MongoCollection является общим (MongoCollection <TDocument> ). Общий тип используется для таких методов записи, как insertOne, а также тип документа по умолчанию для методов, которые запрашивают сбор для документов, например

  • void insertOne (документ TDocument)
  • FindIterable find()

Класс, используемый для представления результатов запроса по умолчанию для TDocument, но может быть изменен путем вызова таких методов, как:

  • FindIterable find (Class <TResult> resultClass)
  • AggregateIterable aggregate (список <? extends Bson > , класс <TResult> resultClass)

Авторы драйверов хотели установить как можно меньше ограничений для этих типов, поскольку они могут быть уже существующими классами POJO. Единственное требование состоит в том, что Codec для класса был зарегистрирован в CodecRegistry для MongoCollection. Подробнее см. здесь.

Для документов BSON, которые используются для представления таких объектов, как фильтры запросов, спецификации обновлений, критерии сортировки и т.д., драйвер накладывает требование, чтобы классы, используемые для этой цели, реализовали новый интерфейс под названием Bson. BasicDBObject, Document и BsonDocument реализуют этот интерфейс, поэтому любой может быть использован, или вы можете создавать свои собственные настраиваемые типы. Сам драйвер возвращает экземпляры Bson из большинства статических методов factory нового строителя, таких как Filters.

Наконец, для вспомогательных методов, возвращающих документы BSON, представляющие результаты административных команд (например, запуск общей команды), драйвер возвращает экземпляры документа по умолчанию.

Если вам требуется преобразование между JSON и Document или BsonDocument, вы можете использовать методы синтаксического анализа и toJson, которые определены непосредственно в этих классах. Под ними они основаны на новых классах JsonReader и JsonWriter, которые были введены в версии 3.0. Подробнее см. здесь.

Авторы не устарели уже существующий класс JSON, но, скорее всего, будут в будущем выпуске.

В отношении того, какой из этих классов использовать, я предлагаю этот совет:

  • При обновлении с версии 2.13 и продолжении использования DB/DBCollection вы все равно должны использовать DBObject. Это не относится к новому драйверу async, который не имеет зависимостей от DBObject.
  • Для новых приложений на основе MongoCollection (sync или async) используйте класс Document.
  • Если вы предпочитаете безопасность типа за счет краткости, используйте BsonDocument. BsonDocument реализует Map < String, BsonValue > , поэтому компилятор не позволит вам добавить неподдерживаемый тип значения, тогда как Document, который реализует Map < String, Object > , (так что возможны ошибки времени выполнения).