将 BSON MongoDB 文档映射到 MyClass.class 对象?

Mapping a BSON MongoDB document to a MyClass.class object?

祝大家有个愉快的一天!

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

My MongoDB Document structure:

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

MyClass.class model:

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

   //empty constructor
   public MyClass() {}

   // Setters and Getters
}

Using JAVA I try:

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

I'm getting an error: Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 10 path $._id

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

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

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
}

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

Here:

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

}

MongoDB requires that you have an '_id' field for all documents. If you don't provide one the driver will assign a ObjectId with a generated value.

现在您需要创建此 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 class:

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.                              ****/
{

Dependency:

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