使用Java将Java对象插入MongoDB集合

Yog*_*ati 29 java mongodb

我试图使用Java将整个Java对象插入到MongoDB集合中.我收到以下错误:

错误:

Exception in thread "main" java.lang.IllegalArgumentException: can't serialize class net.yogesh.test.Employee
    at org.bson.BSONEncoder._putObjectField(BSONEncoder.java:185)
    at org.bson.BSONEncoder.putObject(BSONEncoder.java:119)
    at org.bson.BSONEncoder.putObject(BSONEncoder.java:65)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:176)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:134)
    at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:129)
    at com.mongodb.DBCollection.save(DBCollection.java:418)
    at net.yogesh.test.test.main(test.java:31)
Run Code Online (Sandbox Code Playgroud)

Emplyoee.java(POJO)

package net.yogesh.test;

import java.io.Serializable;

public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    private long no;
    private String name;

    public Employee() {
    }

    public long getNo() {
        return no;
    }

    public void setNo(long no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
Run Code Online (Sandbox Code Playgroud)

主方法类(test.java)

package net.yogesh.test;

import java.net.UnknownHostException;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoException;

public class test {

    public static void main(String[] args) throws UnknownHostException,
            MongoException {

        Mongo mongo = new Mongo("localhost", 27017);
        DB db = mongo.getDB("test");

        Employee employee = new Employee();
        employee.setNo(1L);
        employee.setName("yogesh");


        BasicDBObject basicDBObject = new BasicDBObject("Name", employee);

        DBCollection dbCollection = db.getCollection("NameColl");

        dbCollection.save(basicDBObject);   

    }

}
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么我收到这个错误?

Rem*_*iet 29

我有点困惑为什么你认为这首先会起作用.有些东西需要知道如何将POJO映射到MongoDB文档.目前你没有告诉系统的任何部分如何做到这一点.

您可以使用映射库(Morphia浮现)或使用ReflectionDBObject.两种解决方案(前者比后者更好)允许您将POJO映射到MongoDB文档并返回.

  • 当 mongo 驱动程序原生支持 POJO 时,为什么要选择使用第三方库?https://mongodb.github.io/mongo-java-driver/3.5/driver/getting-started/quick-start-pojo/ (3认同)

Dam*_*RAS 21


你继续强类型对象的工作,因为你想

魂斗罗
有些人真的不喜欢:延长


package foo;
import com.mongodb.BasicDBObject;

public class Employee extends BasicDBObject {

private static final long serialVersionUID = 2105061907470199595L;
//should be something shorter as "name" like "n" 
//here just use name to conform your  sample
public static final String NAME = "name";
public static final String NO = "no";
public static final String COLLECTION_NAME = "employee";

public Long getNo() {
    return getLong(NO);
}

public void setNo(long no) {
    put(NO, no);
}

public String getName() {
    return getString(NAME);
}

public void setName(String name) {
    put(NAME, name);
}
Run Code Online (Sandbox Code Playgroud)

}


package foo;
import java.net.UnknownHostException;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoException;

public class Test {

public static void main(String[] args) throws UnknownHostException,
        MongoException {

    Mongo mongo = new Mongo("localhost", 27017);
    DB db = mongo.getDB("yeahMongo");

    Employee employee = new Employee();
    employee.setNo(1L);
    employee.setName("yogesh");

    DBCollection employeeCollection = null ;
    employeeCollection = db.getCollection(Employee.COLLECTION_NAME);

    employeeCollection.save(employee);

    System.err.println(employeeCollection.findOne());

}
Run Code Online (Sandbox Code Playgroud)

}

除了morphia,你应该看看jongo:http: //jongo.org/jongo使用与js mongo引擎相同的表单语法,我发现它对初学者来说很有意义.您不必在mongojs和java之间切换思维导图.你可以使用js样本,几乎没有变化.


小智 21

DB db = mongoClient.getDB( "mydb" );

coll = db.getCollection("testCollection");

Employee emp = new Employee();
emp.setId("1001");
emp.setName("John Doe");

//Converting a custom Class(Employee) to BasicDBObject
Gson gson = new Gson();
BasicDBObject obj = (BasicDBObject)JSON.parse(gson.toJson(emp));
coll.insert(obj);
findEmployee(new BasicDBObject("id","1001"));


public static void findEmployee(BasicDBObject query){

    DBCursor cursor = coll.find(query);

    try {
       while(cursor.hasNext()) {
          DBObject dbobj = cursor.next();
        //Converting BasicDBObject to a custom Class(Employee)
          Employee emp = (new Gson()).fromJson(dbobj.toString(), Employee.class);
          System.out.println(emp.getName());
       }
    } finally {
       cursor.close();
    }

}
Run Code Online (Sandbox Code Playgroud)

我认为发布以两种方式进行转换的代码会很有用.
存储员工对象
查找并重新创建员工对象
希望这很有用..


vik*_*sse 13

您可以使用gson库将java对象转换为json字符串,然后将其插入mongodb.

例如:

Gson gson = new Gson();
String json = gson.toJson(Employee);    
BasicDBObject basicDBObject = new BasicDBObject("Name", json );          
DBCollection dbCollection = db.getCollection("NameColl");          
dbCollection.save(basicDBObject);    
Run Code Online (Sandbox Code Playgroud)


kub*_*ntu 7

自提出此问题以来,已经有一些变化.test.java在问题中使用,以下是使用Google的方法Gson:

import com.google.gson.Gson;
import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class test {
  public static void main(String[] args) {
    MongoClient mongoClient = new MongoClient(); // Connect with default settings i.e. localhost:27017
    MongoDatabase db = mongoClient.getDatabase("test"); // Get database "test". Creates one if it doesn't exist
    Employee employee = new Employee(); // Create java object
    employee.setNo(1L);
    employee.setName("yogesh");
    // Deserialize object to json string
    Gson gson = new Gson();
    String json = gson.toJson(employee);
    // Parse to bson document and insert
    Document doc = Document.parse(json);
    db.getCollection("NameColl").insertOne(doc);

    // Retrieve to ensure object was inserted
    FindIterable<Document> iterable = db.getCollection("NameColl").find();
    iterable.forEach(new Block<Document>() {
      @Override
      public void apply(final Document document) {
        System.out.println(document); // See below to convert document back to Employee
      }
    });

  }
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用Gson将检索到的bson文档转换回Java对象:

Gson gson = new Gson();
Employee emp = gson.fromJson(document.toJson(), Employee.class);
Run Code Online (Sandbox Code Playgroud)


das*_*h1e 6

使用MongoDB,您无法在数据库中插入Java bean,但必须将它们重新映射到MongoDB Object.

在你的情况下你必须这样做:

BasicDBObject basicDBObject = new BasicDBObject();
basicDBObject.put("no", employee.getNo());
basicDBObject.put("name", employee.getName());
Run Code Online (Sandbox Code Playgroud)