0

私は、MongoDBコレクション内のすべてのドキュメントをHadoopで記述されたMapReduceジョブに通すことができるMongoInputFormatで遊んでいます。

提供されている例(thisthisthis)でわかるように、マッパーに提供されるドキュメントのタイプはBSONObject(Javaのインターフェイス)です。

今では、MongoDBからの生データをはるかに使いやすいPOJOにマッピングできるMorphiaも非常に気に入っています。

入力としてBSONObjectしか取得できないため、Morphiawikiのこのページの下部に記載されているメソッドを使用することを考えました。

BlogEntry blogEntry = morphia.fromDBObject(BlogEntry.class, blogEntryDbObj);

私の問題は、このメソッドがBSONObjectではなくDBObjectを必要とすることです。DBObjectは実際には次のとおりです。

public interface DBObject extends BSONObject

ご覧のとおり、BSONObjectからDBObjectにキャストして、提供されたメソッドを呼び出すことはできません。

これを最善の方法で処理するにはどうすればよいですか?

4

2 に答える 2

1

BSONObjectDBObjectインターフェースが非常に似ていることに気付くでしょう。コンバーソンが存在しないからといって、些細なコンバーソンを作成するのが簡単ではないという意味ではありません。

class BSONDBObject extends BasicBSONObject implements DBObject {
    boolean ispartial = false;
    public BSONDBObject(BSONObject source) {
        this.putAll(source);
    }
    public boolean isPartialObject() {
        return ispartial;
    }
    public void markAsPartialObject() {
        this.ispartial = true;
    }
}

今、あなたはただする必要があります

BSONObject bson; // Filled by the MongoInputFormat
BSONBDObject dbo = BSONDBObject(bson);
EntityCache = entityCache = new DefaultEntityCache();
BlogEntry blogEntry = morphia().fromDBObject(BlogEntry.class, dbo, entityCache);
于 2013-12-09T01:00:11.000 に答える
-1

私は私のために働く解決策を見つけました:

  • まず、JSONテキスト文字列にします
  • これをDBObjectに解析します
  • Morphiaを使用してそれを有用なインスタンスにマッピングします。

事実上、私は次のようなものを持っています:

BSONObject bson; // Filled by the MongoInputFormat

EntityCache = entityCache = new DefaultEntityCache();
String json = JSON.serialize(bson)    
DBObject dbObject = (DBObject) JSON.parse(json);
BlogEntry blogEntry = morphia().fromDBObject(BlogEntry.class, dbObject, entityCache);
于 2012-09-28T15:47:46.670 に答える