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