如何使用 mongoTemplate 检索特定列表对象?

How to retrieve a particular list object using mongoTemplate?

我有一个 mongo 文档,如下所示:

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

现在我想检索 addrId 为 123 的地址对象,personId - 6138cf5b5d79d616c28b8e6c。我有以下接受 personId 和 addrId 的 java 方法。我如何使用 mongoTemplate

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

这样好吗:

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

您也可以通过添加地址 ID 条件来改进查询。

query.addCriteria(new Criteria().andOperator(Criteria.where("personId").is(personId),
                Criteria.where("address.addrId").is(addrId)));

这也将 return 只有具有所需地址 ID 的文档。

这符合我的预期:

    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;