【问题标题】:Converting DBObject to Java Object while retrieve values from MongoDB从 MongoDB 检索值时将 DBObject 转换为 Java 对象
【发布时间】:2014-01-03 10:48:08
【问题描述】:

从我的 Java 应用程序中,我将 mongoDB 中的值存储在 ArrayList(Java 对象集)中。 如何从 DBObject 中检索数据

我将数据存储在 mongoDB 中,如下所示:

{  "students" : [{"firstName" : "Jesse", "lastName" : "Varnell", "age" : "15", "gender" : "M" }, { "firstName" : "John", "lastName" : "Doe", "age" : "13", "gender" : "F"}] }

我有学生的 Java 对象,例如:

public class Student {
    public String firstName;
    public String lastName;
    public String age;
    public String gender;  // M, F      
}

我正在从 mongoDB 中检索数据,例如:

BasicDBObject query = new BasicDBObject();
query.put("user", username); 
DBCursor cursor = theCollection.find(query); 
while (cursor.hasNext()) {
    DBObject theObj = cursor.next();
    //How to get the DBObject value to ArrayList of Java Object?
}

【问题讨论】:

    标签: java mongodb mongodb-java dbobject


    【解决方案1】:

    你可以这样做:

    List<Student> students = new ArrayList<Student>();
    
    BasicDBObject query = new BasicDBObject();
    query.put("user", username); 
    DBCursor cursor = theCollection.find(query); 
    while (cursor.hasNext()) {
        DBObject theObj = cursor.next();
        //How to get the DBObject value to ArrayList of Java Object?
    
        BasicDBList studentsList = (BasicDBList) theObj.get("students");
        for (int i = 0; i < studentsList.size(); i++) {
            BasicDBObject studentObj = (BasicDBObject) studentsList.get(i);
            String firstName = studentObj.getString("firstName");
            String lastName = studentObj.getString("lastName");
            String age = studentObj.getString("age");
            String gender = studentObj.getString("gender");
    
            Student student = new Student();
            student.setFirstName(firstName);
            student.setLastName(lastName);
            student.setAge(age);
            student.setGender(gender);
    
            students.add(student);
        }               
    }
    

    【讨论】:

    • 感谢 Parvin 的回复。当我尝试上面的代码时,我得到了以下异常: 原因:java.lang.ClassCastException:java.lang.String 无法转换为 com.mongodb.BasicDBList 其中 theObj.get("students") 在字符串中。
    • 您确定数据库中的学生字段将数据存储为数组吗?如果您在上面编写的 json 对象是正确的,那么这段代码应该可以工作。我在本地尝试相同的代码,它工作正常。很可能你在 DB 中的学生是字符串而不是数组。
    • 是的。我只是从数据库中复制了值。实际上,它只是将数据存储为数组。它不是一个字符串。
    • 你能分享单个文档的完整 json 对象吗?
    • 这是来自 MongoDB 的单个文档:{ "loginid" : "john.doe@mail.com", "streetAddress" : "4 King Farm Rd", "zipcode" : "17532", “residenceType”:“单身”,“cityState”:“Holtwood,PA”,“电话”:“7172845772”,“cmets”:“”,“学生”:[{“firstName”:“Ronn”,“lastName” : "Perkins", "age" : "50", "gender" : "M" }, { "firstName" : "Lavinia", "lastName" : "Perkins", "age" : "47", "gender" : "F" }], "_created" : NumberLong("1339102359831"), "_modified" : NumberLong("1351954577018") }
    【解决方案2】:

    您通常为此使用 ORM 工具(尽管在非关系数据库的情况下将其称为 ORM 没有意义)。

    有几种这样的工具。我喜欢 spring-data,它为您隐藏了很多样板代码,并为您提供了简单、干净的语法。像这样的:

    @Repository
    public class UserRepositoryImpl implements UserRepository {
    
        private MongoTemplate mongoTemplate;
    
        @Autowired
        public UserRepositoryImpl(MongoTemplate mongoTemplate) {
            this.mongoTemplate = mongoTemplate;
        }
    
        @Override
        public User findsUserByUsernameAndPassword(String userName, String encodedPassword) {
            return mongoTemplate.findOne(query(where("userName").is(userName).and("encodedPassword").is(encodedPassword)), User.class);
        }
    }
    

    User 类定义为:

    @Document(collection = "users")
    public class User {
    
        private String userName;
    
        private String encodedPassword;
    
        // snip getters and setters
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 2020-08-31
      • 2021-06-22
      相关资源
      最近更新 更多