【问题标题】:Mapping a BSON MongoDB document to a MyClass.class object?将 BSON MongoDB 文档映射到 MyClass.class 对象?
【发布时间】:2020-08-07 18:41:13
【问题描述】:

祝大家有个愉快的一天!

我正在尝试在 JAVA 中理解 MongoDB。我正在尝试将 MongoDB Document 对象映射到我自己的 java 对象。

我的 MongoDB 文档结构

{
    "_id" : {
        "$oid" : "5f2d37f1cdf2f93d01fd5f9a"
    },
    "Person_ID" : {
        "$numberInt" : "3"
    }, "Name" : "John", "Lastname" : "Doe"
}

MyClass.class 模型:

public class MyClass {
    String oid;
    int Person_ID;
    int numberInt;
    String Name, Lastname;

   //empty constructor
   public MyClass() {}

   // Setters and Getters
}

我尝试使用 JAVA:

public static void main(String[] args) {
    
    MongoClientURI uri = new MongoClientURI(
        "mongodb+srv://<username>:<password>@cluster.lt8te.mongodb.net/dbProject? 
          retryWrites=true&w=majority"); 
   
    MongoClient client = new MongoClient(uri);            
    MongoDatabase db = client.getDatabase("dbProject");
    MongoCollection<Document> coll = db.getCollection("myCollection");
    Document doc = (Document) coll.find().first();
    
    System.out.println(doc.toJson());
    
    Gson gson = new Gson();
    MongoObject mongoObj = gson.fromJson(doc.toJson(), MyClass.class);
}

我遇到了一个错误: 原因:java.lang.IllegalStateException:应为字符串,但在第 1 行第 10 列路径 $._id 处为 BEGIN_OBJECT

我认为我的 MyClass 模型与 Document mongoDB 模型不匹配。 我不太确定我哪里出错了。或者要编辑什么? 谢谢。

【问题讨论】:

    标签: java mongodb netbeans pojo


    【解决方案1】:

    最后一行你试图将一个 JSON 映射到你的 MyClass java 对象。为此,JSON 结构必须与您的 java 类匹配。假设来自doc.toJson() 的 JSON 结果看起来像您展示的 Mongo 文档,请按如下方式实现您的类。这个想法是您的 JSON 文档数据类型应该与您的类匹配,例如您的 JSON 中的 Person_ID 是一个具有三个属性的对象,因此在您的 java 类中应该有一个名为 Person_ID 的变量,它将属于另一个类具有三个属性的类型。

    public class MyClass {
        ID _id;
        Person Person_ID;
    
       //empty constructor
       public MyClass() {}
    
       // Setters and Getters
    
    
    }
    
    Class ID{
       public String oid;
       //Getter setter
    }
    
    Class Person {
        int numberInt;
        String Name;
        String Lastname;
    
    //Getter setter
    }
    

    【讨论】:

    • 感谢您的帮助。你的建议帮助了我。最后,文件的结构不同。但我已经知道该怎么做了。谢谢!!!
    【解决方案2】:

    所以经过几个小时的学习。在 StackOverFlow 的帮助下,我可以在这里提出一个可以帮助其他人的解决方案。让我们掌握 BSON 文档的结构,我在这里举个例子。

    这里:

    {
       "_id" : {
           "$oid" : "5f2d37f1cdf2f93d01fd5f9a"
       },
       "Person_ID" : {
           "$numberInt" : "3"
       }, "Name" : "John", "Lastname" : "Doe"
    

    }

    MongoDB 要求所有文档都有一个“_id”字段。如果您不提供,驱动程序将分配一个带有生成值的 ObjectId。

    现在您需要创建此 JSON 的对象模型。 像这样:(保持字段的顺序很重要。)

    import org.bson.types.ObjectId;
    
    public class ModelMongo 
    {
        ObjectId _id;
        int Person_ID;
        String Name;
        String Lastname;
    
        public ModelMongo(ObjectId id, int Person_ID, String Name, String Lastname) 
        }
            this._id = id;
            this.Person_ID = Person_ID;
            this.Name = Name;
            this.Lastname = Lastname;
        {
    
          // Setter and Getter ...      
    }
    

    假设您的文档结构与上面示例中的相同,并且您希望将域 mongo 文档映射到您自己的 java 类:

    public static void main(String[] args)
    }
        MongoClient client = new MongoClient(uri);            
        MongoDatabase db = client.getDatabase("dbProject");
        MongoCollection<org.bson.Document> coll = db.getCollection("myCollection");
        Document doc = (Document) coll.find().first();
    
        Gson gson = new Gson();
        ModelMongo model = gson.fromJson(doc.toJson(), ModelMongo.class);  
    
        /***                                                ****
        * Now in the variable model is a Document from MongoDB *
        * Access to variables of that Object possible through  *
        * its Getter methods.                              ****/
    {
    

    依赖:

    <!-- https://mvnrepository.com/artifact/org.mongodb/bson -->
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>bson</artifactId>
        <version>4.0.4</version>
    </dependency>
    
    
      
    

    【讨论】:

    • 为了简化它看起来你可以有一个无参数的构造函数,而不是依赖你的公共 getter 和 setter。
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2021-09-03
    • 2023-04-02
    • 2015-09-27
    • 2018-01-19
    相关资源
    最近更新 更多