5

Javaのユーザー定義クラスのオブジェクトをmongodbコレクションに挿入しようとしています。

私のクラスは次のようなものです。

class C extends ReflectionDBObject
{
    int i;
    C(){}
}

挿入用のコードは

Mongo m = new Mongo("localhost");
com.mongodb.DB appdb = m.getDB("appdb");
DBCollection cmpcol = appdb.getCollection("feed");
DBObject bdbo = new BasicDBObject();
C c = new C();
c.i = 1;
bdbo.put("a",c);
cmpcol.insert(bdbo);

ただし、挿入時に、オブジェクトはデータベースではnull値で表されます。何が間違っているのですか??gsonやmorphiaを使いたくありません。

4

1 に答える 1

13

Java ドライバーは、ReflectionDBObject クラスで getter メソッドと setter メソッド (変数ではない) を使用して、ドキュメントに含めるプロパティを決定します。

したがって、コードは次のようになります。

public class C extends ReflectionDBObject
{
    int i;

    public int geti()
    {
        return i;
    }

    public void seti(int i)
    {
        this.i = i;
    }
}

これにより、コレクション内に次のようなオブジェクトが作成されます。

{ "_id" : ObjectId("504567d903641896aa40bde6"), "a" : { "_id" : null, "i" : 1 } }

"_id" : nullサブドキュメントのを取り除く方法を知りません。これは ReflectionDBObject クラスの特徴です。通常、サブドキュメントには _id はありませんが、サブドキュメントに null 以外の _id が必要な場合は、C() コンストラクターに次のコードを追加できます。

public C()
{
    set_id(ObjectId.get());
}

これにより、次のようなオブジェクトが生成されます。

{ 
  "_id" : ObjectId("504568ff0364c2a4a975b375"), 
  "a" : { "_id" : ObjectId("504568ff0364c2a4a975b374"), "i" : 1 } 
}

最後に、プロパティ「i」の規則は少し変わっていることgeti()に注意してください。JavaBeans 仕様では、プロパティ「i」を持つseti()必要があるgetI()とメソッドが述べています。setI()ただし、MongoDB ドライバーは、ReflectionDBObject クラスに対してはそのようには機能しません。

于 2012-09-04T02:53:40.120 に答える