web-dev-qa-db-ja.com

MongoDBを使用してDBObjectをPOJOに変換するJava Driver

MongoDBはBSON/JSONオブジェクトを返すようです。

きっとあなたは値をStringsやintなどとして取り出してPOJOとして保存できると思いました。

リストを繰り返した結果として、DBObject(BasicDBObjectとしてインスタンス化されています)...(cur.next())があります。

データをPOJOに入れてJSON serlialiser/deserialiserを使用する唯一の方法(ある種の永続フレームワークを使用する以外)はありますか?

私の方法は次のようになります:

public List<User> findByEmail(String email){
         DBCollection userColl;
         try {
            userColl = Dao.getDB().getCollection("users"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (MongoException e) { e.printStackTrace();}
            DBCursor cur = userColl.find();
            List<User> usersWithMatchEmail = new ArrayList<User>();

            while(cur.hasNext()) {
               // this is where I want to convert cur.next() into a <User> POJO
               usersWithMatchEmail.add(cur.next());
            }
        return null;
    }

編集:それはかなり明白です、ちょうどこのようなことをしてください。

17
Ankur

いくつかのJava libsが役立ちます:

9
Igor Artamonov

Springがこれのためにすでに構築したものを使って、重労働をやってみましょう...

実際のトリックは次のとおりです。mongoTemplate.getConverter()。read(Foo.class、obj);

たとえば、DBCursorを使用する場合-

while (cursor.hasNext()) { 
    DBObject obj = cursor.next(); 
    Foo foo = mongoTemplate.getConverter().read(Foo.class, obj);  
    returnList.add(foo); 
}

http://revelfire.com/spring-data-mongodb-convert-from-raw-query-dbobject/

44
chris mathias

遅い答えですが、誰かがこれが役に立つと思うかもしれません。

GSONを使用してBasicDBObjectからTinyBlogDBObjectである自分のPOJOに変換します

TinyBlogDBObject obj = convertJSONToPojo(cursor.next().toString());

private static TinyBlogDBObject convertJSONToPojo(String json){

    Type type = new TypeToken< TinyBlogDBObject >(){}.getType();

    return new Gson().fromJson(json, type);

}
6
cherit

1。 MongoDatabase Beanに適切なCodecRegistryを提供します

@Bean
public MongoClient mongoClient() {
    ConnectionString connectionString = new ConnectionString("mongodb://username:[email protected]:27017/dbname");

    ConnectionPoolSettings connectionPoolSettings = ConnectionPoolSettings.builder()
            .minSize(2)
            .maxSize(20)
            .maxWaitQueueSize(100)
            .maxConnectionIdleTime(60, TimeUnit.SECONDS)
            .maxConnectionLifeTime(300, TimeUnit.SECONDS)
            .build();

    SocketSettings socketSettings = SocketSettings.builder()
            .connectTimeout(5, TimeUnit.SECONDS)
            .readTimeout(5, TimeUnit.SECONDS)
            .build();

    MongoClientSettings clientSettings = MongoClientSettings.builder()
            .applyConnectionString(connectionString)
            .applyToConnectionPoolSettings(builder -> builder.applySettings(connectionPoolSettings))
            .applyToSocketSettings(builder -> builder.applySettings(socketSettings))
            .build();

    return MongoClients.create(clientSettings);
}

@Bean 
public MongoDatabase mongoDatabase(MongoClient mongoClient) {
    CodecRegistry defaultCodecRegistry = MongoClientSettings.getDefaultCodecRegistry();
    CodecRegistry fromProvider = CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build());
    CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(defaultCodecRegistry, fromProvider);
    return mongoClient.getDatabase("dbname").withCodecRegistry(pojoCodecRegistry);
}

2。 POJOSに注釈を付ける

public class ProductEntity {

    @BsonProperty("name") public final String name;
    @BsonProperty("description") public final String description;
    @BsonProperty("thumb") public final ThumbEntity thumbEntity;

    @BsonCreator
    public ProductEntity(
            @BsonProperty("name") String name,
            @BsonProperty("description") String description,
            @BsonProperty("thumb") ThumbEntity thumbEntity) {
        this.name = name;
        this.description = description;
        this.thumbEntity = thumbEntity;
    }
}

public class ThumbEntity {

    @BsonProperty("width") public final Integer width;
    @BsonProperty("height") public final Integer height;
    @BsonProperty("url") public final String url;

    @BsonCreator
    public ThumbEntity(
            @BsonProperty("width") Integer width,
            @BsonProperty("height") Integer height,
            @BsonProperty("url") String url) {
        this.width = width;
        this.height = height;
        this.url = url;
    }
}

3。 mongoDBをクエリしてPOJOSを取得する

MongoCollection<Document> collection = mongoDatabase.getCollection("product");
Document query = new Document();
List<ProductEntity> products = collection.find(query, ProductEntity.class).into(new ArrayList<>());

他の投稿で私の答えを確認してください
org.bson.DocumentおよびVice VersaへのPOJO

4
kamildab_84

Googleが提供する [〜#〜] gson [〜#〜] ライブラリを使用できます。これが example です。 Jettision APIなど、jsonをpojoに変換するために使用できる他の多くのAPIがあります。

3
Anand Soni