如何在mongo db中对refrence集合使用条件查询

时间:2015-10-28 07:15:27

标签: mongodb spring-data

如何找到所有拥有城市的人=" XYZ"在地址集合

public class Person { 
 @Id
private String id;

private String description

@DBRef
private Address address;

// Getters and Setters
}

public class Address
{
@Id
private String id;

private String area

private String city

// Getters and Setters
}

1 个答案:

答案 0 :(得分:0)

Mongo将 @DBRef 理解为对另一个文档的引用,在本例中为Address文档,并且最终从MongoDB加载对象时,这些引用将会热切地已解决,这将作为HATEOAS友好链接填充给用户。您将获得一个映射对象,该对象看起来与嵌入在主文档中的对象相同。

您可以为给定对象定义您的存储库,它将端点映射到您的数据库,例如下面定义的PersonRepository

import com.mycompany.domain.Person;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface PersonRepository extends MongoRepository<Person, String> {

    List<Person> findByCity(@Param("city") String city);

}

使用查询条件方法解决此问题的另一种方法是执行两个查询。

  1. 首先查询是获取具有city = "XYZ"的地址文档。从返回的列表中解析ID。
  2. 使用上一个操作中的ID在Person实体上生成另一个查询。
  3. 以下演示了这种方法

    Query addressQuery = new Query(where("city").is("XYZ"));
    addressQuery.fields().include("_id");
    List<Address> addressList = mongoTemplate.find(addressQuery, Address.class, "address"); // get the addresses list that satisfy the given city criteria
    
    // Resolve the ids for the addresses
    final List<ObjectId> addressIds = new ArrayList<ObjectId>(addressList.length);      
    for(final Address address : addressList) {
        addressIds.add(new ObjectId(address.getId()));
    }
    
    // Get the Person list using the ids from the previous operation
    Query personQuery = new Query(where("address.$id").in(addressIds));
    List<Person> list = mongoTemplate.find(personQuery, Person.class, "person");
    

    如果您事先知道地址ID,则可以使用自定义查询:

    public interface PersonRepository extends MongoRepository<Person, String> {
    
        @Query("{ 'address': {'$ref': 'address', '$id': { '$oid': ?0 } } }")
        List<Person> findByAddres(String addressIdAsString);
    }