2015-04-18 15 views
13

Sto cercando di capire l'implementazione BSON utilizzata dal driver Java MongoDB (quello asincrono ufficiale, nel caso sia importante).Confusione della classe Java MongoDB/BSON

Tuttavia, sono completamente bloccato sulle classi che rappresentano i documenti BSON. Mi sto concentrando su quelli "normali", ignorando caratteristiche come costruzione pigra per ora. Finora, ho trovato:

  • BasicBSONObject
  • BsonDocument
  • Documento
  • BSONObject, un'interfaccia implementati da BasicBSONObject, ma non gli altri

Ho anche scoperto che il MongoDB il driver restituisce i risultati come istanze del documento per impostazione predefinita e può essere modificato per restituire BsonDocument. OTOH, la classe JSON vuole restituire un DBObject, che è implementato da BasicDBObject estende BasicBSONObject.

Come sono correlate queste classi? Quale dovrebbe essere usato nel qual caso?

Quando si scrive un codice che accetta un documento BSON come parametro o lo si restituisce, quale tipo dovrei usare? Questa è in realtà la domanda a cui sono più interessato, ma le restrizioni di cui sopra sembrano contraddire.

risposta

31

Prima del driver 3.0, tutti i documenti BSON erano rappresentati come istanze di BSONObject, un'interfaccia nel pacchetto org.bson. L'API del driver (DBCollection, ecc.) Impone inoltre una richiesta di DBObject, una sotto-interfaccia di BSONObject. La maggior parte degli utenti del driver fa affidamento su BasicDBObject come classe concreta che implementa DBObject.

Inoltre, la classe JSON, che analizza e serializza su JSON, produce e prevede le istanze di DBObject.

Nella nuova 3.0 driver CRUD API (MongoCollection), il ruolo che DBObject ha svolto in DBCollection è stato suddiviso.

MongoCollection è generico (MongoCollection < TDocument>). Il tipo generico è usato per i metodi di scrittura come insertOne, ed è anche il tipo di documento di default per i metodi che interrogano la raccolta di documenti, ad esempio

  • vuoto insertOne (documento TDocument)
  • find FindIterable()

La classe utilizzata per rappresentare i risultati delle query default TDocument, ma può essere modificato con metodi di chiamata come:

  • find FindIterable (classe < TResult> resultClass)
  • Aggregate Aggregato aggregato (Lista <? si estende BSON> gasdotto, Class < TResult> resultClass)

Il conducente autori hanno voluto porre il minor numero possibile di restrizioni su questi tipi, in quanto potrebbero essere pre-esistenti classi POJO. L'unico requisito è che un Codec per la classe sia stato registrato nel CodecRegistry per MongoCollection. Vedere here per i dettagli.

Per i documenti BSON utilizzati per rappresentare entità come filtri di query, specifiche di aggiornamento, criteri di ordinamento, ecc., Il driver impone il requisito che le classi utilizzate per questo scopo implementino una nuova interfaccia denominata Bson. BasicDBObject, Document e BsonDocument implementano tutti quell'interfaccia, quindi possono essere utilizzati tutti, oppure è possibile creare i propri tipi personalizzati che lo fanno. Il driver stesso restituisce le istanze di Bson dalla maggior parte dei nuovi metodi di factory static del builder, come quelli della classe Filters.

Infine, per i metodi di supporto che restituiscono documenti BSON che rappresentano i risultati di comandi amministrativi (come l'esecuzione di un comando generico), il driver restituisce le istanze di Documento per impostazione predefinita.

Se è necessaria la conversione tra JSON e Documento o BsonDocument, è possibile utilizzare i metodi parse e toJson definiti direttamente su tali classi. Sotto, questi si basano sulle nuove classi JsonReader e JsonWriter introdotte in 3.0. Vedi here per maggiori dettagli.

Gli autori non hanno ancora deprecato la classe JSON esistente, ma molto probabilmente lo saranno in una versione futura.

in termini di quale di queste classi da usare, ti offro questo consiglio:

  • Se l'aggiornamento da 2.13 e continuando uso di DB/DBCollection, è comunque necessario utilizzare DBOBJECT. Questo non si applica al nuovo driver asincrono, che non ha dipendenze da DBObject.
  • Per le nuove applicazioni basate su MongoCollection (sincronizzazione o asincrona), utilizzare la classe Documento.
  • Se si preferisce la sicurezza del tipo a scapito della brevità, utilizzare BsonDocument. BsonDocument implementa la Map < String, BsonValue> in modo che il compilatore non ti permetta di aggiungere un tipo di valore non supportato, mentre Documento, che implementa la Map < String, Object>, (sono possibili errori di runtime).
Problemi correlati