如何找到所有拥有城市的人=" 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
}
答案 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);
}
使用查询条件方法解决此问题的另一种方法是执行两个查询。
city = "XYZ"
的地址文档。从返回的列表中解析ID。 Person
实体上生成另一个查询。以下演示了这种方法
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);
}