【问题标题】:Inserting an java object using ReflectionDBObject class in mongodb?在 mongodb 中使用 ReflectionDBObject 类插入 java 对象?
【发布时间】:2025-12-26 03:15:11
【问题描述】:

我正在尝试将 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。

【问题讨论】:

    标签: java mongodb database


    【解决方案1】:

    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()seti() 约定有点不寻常。 JavaBeans 规范说您需要getI()setI() 方法才能拥有属性“i”。但是 MongoDB 驱动程序不适用于 ReflectionDBObject 类。

    【讨论】:

    • 非常感谢伊恩的帮助!!