How to retrieve a particular list object using mongoTemplate?

Issue

I have a mongo document like below:

{
    "personId" : ObjectId("6138cf5b5d79d616c28b8e6c"),
    "address" : [
                 {
                  "addrId": "123",
                  "Street" : "abc"
                 },
                 {
                  "addrId":  "456",
                  "Street" : "xyz"
                 }]
}

Now I want to retrieve the address object with addrId 123 for personId – 6138cf5b5d79d616c28b8e6c. I have below java method which accepts personId and addrId. How do I achieve that using mongoTemplate

public Address getAddrObject(String personId, String addrId) {
 // need logic to return addr object with passed addrId
}

Is this the good way:

public Address getAddrObject(String personId, String addrId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("personId").is(personId));
        Person person = mongoTemplate.findOne(query, Person.class);


        for(Address add : person.getAddress()){
            if(add.getAddrId().equals(addrId)){
                return add;
            }
        }

        return null;
}

Solution

This works as expected for me:

    Query query = new Query();
    query.addCriteria(Criteria.where("personId").is(personId));
    query.addCriteria(Criteria.where("addrId").is(addrId));
    query.fields().include("address.$");
    Person person = mongoTemplate.findOne(query, Person.class);

    if(person!=null && person.getAddress()!=null && person.getAddress().size() > 0) {
        return person.getAddress().get(0);
    }
    return  null;

Answered By – Coder17

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published