8

From my Java application, I have stored the values in mongoDB in ArrayList(set of Java objects). How can I retrieve the data from DBObject

I am storing the data in mongoDB like this:

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

I am having the Java Object for the Student like:

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

I am retrieving the data from mongoDB like:

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?
}

2 Answers 2

14

You can do it as follows :

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);
    }               
}
Sign up to request clarification or add additional context in comments.

7 Comments

Thanks Parvin for the response. When I tried the above code, I got the following exception: Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to com.mongodb.BasicDBList Where the theObj.get("students") is in String.
Are you sure that students field in DB stores data as array? If the json object you write above is correct then this code should work. I try same code on my local and it works correctly. Most probably you students in DB as string not array.
Yes. I just copied the values from DB only. Actually, It is storing the data as Array only. It is not a string.
Can you share the full json object for single document?
This is the single document from MongoDB: { "loginid" : "[email protected]", "streetAddress" : "4 King Farm Rd", "zipcode" : "17532", "residenceType" : "single", "cityState" : "Holtwood, PA", "phone" : "7172845772", "comments" : "", "students" : [{ "firstName" : "Ronn", "lastName" : "Perkins", "age" : "50", "gender" : "M" }, { "firstName" : "Lavinia", "lastName" : "Perkins", "age" : "47", "gender" : "F" }], "_created" : NumberLong("1339102359831"), "_modified" : NumberLong("1351954577018") }
|
5

You generally use an ORM tool for that (though it wouldn't be meaningful to call it ORM in the case of a non relational database).

There are several such tools. I like spring-data, which hides a lot of boiler plate code for you and gives you a simple, clean syntax. Something like this:

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

With the User class defined as:

@Document(collection = "users")
public class User {

    private String userName;

    private String encodedPassword;

    // snip getters and setters

}

1 Comment

Unrelated but I'm from the future (2022), we called these ODM (Object Document Mapping)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.