Преобразование DBObject в объект Java при извлечении значений из MongoDB

Из моего 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?
}

person It's me    schedule 03.01.2014    source источник


Ответы (2)


Вы можете сделать это следующим образом:

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);
    }               
}
person Parvin Gasimzade    schedule 03.01.2014
comment
Спасибо Парвин за ответ. Когда я попробовал приведенный выше код, я получил следующее исключение: Вызвано: java.lang.ClassCastException: java.lang.String нельзя преобразовать в com.mongodb.BasicDBList Где theObj.get(students) находится в String. - person It's me; 03.01.2014
comment
Вы уверены, что поле студентов в БД хранит данные в виде массива? Если объект json, который вы написали выше, правильный, этот код должен работать. Я пробую тот же код на своем локальном компьютере, и он работает правильно. Скорее всего, вы изучаете БД как строку, а не массив. - person Parvin Gasimzade; 03.01.2014
comment
Да. Я просто скопировал значения только из БД. На самом деле, он хранит данные только как массив. Это не строка. - person It's me; 03.01.2014
comment
Можете ли вы поделиться полным объектом json для одного документа? - person Parvin Gasimzade; 03.01.2014
comment
Это единственный документ из MongoDB: {loginid: [email protected], streetAddress: 4 King Farm Rd, почтовый индекс: 17532, ResidenceType: single, cityState: Holtwood, PA, phone: 7172845772, комментарии: , студенты: [ {Имя: Ронн, Фамилия: Перкинс, возраст: 50, пол: M}, {Имя: Лавиния, фамилия: Перкинс, возраст: 47, пол: F}], _created: NumberLong(1339102359831), _modified: NumberLong(1351954577018) } - person It's me; 03.01.2014
comment
Я попробовал тот же код с заданными данными на моем локальном компьютере, и он работает. Проверьте свой код еще раз. - person Parvin Gasimzade; 03.01.2014
comment
давайте продолжим это обсуждение в чате - person Parvin Gasimzade; 03.01.2014

Обычно для этого используется инструмент 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

}
person Mzzl    schedule 03.01.2014