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);

但是在插入时,对象在数据库中由空值表示。我在做什么错??我不想使用 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,但如果您想要子文档的非空 _id,您可以将以下代码放入您的 C() 构造函数中:

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

这将产生如下对象:

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

最后,请注意属性“i”的geti()andseti()约定有点不寻常。JavaBeans 规范说您需要getI()setI()方法拥有一个属性“i”。但是,MongoDB 驱动程序不适用于 ReflectionDBObject 类。

于 2012-09-04T02:53:40.120 回答