在 Mongo 数据库的 Morphia 查询中有条件多个过滤器
Having conditional multiple filters in Morphia query for Mongo database
环境:MongoDb3.2,Morphia 1.1.0
假设我有一个 Employees 集合,Employee 实体有几个字段。我需要做一些事情,比如应用多个过滤器 (条件) 和 return 每个请求一批 10 条记录。
伪代码如下。
@Entity("Employee")
Employee{
String firstname,
String lastName,
int salary,
int deptCode,
String nationality
}
并且在我的EmployeeFilterRequest
中我将请求参数携带到dao
EmployeeFilterRequest{
int salaryLessThen
int deptCode,
String nationality..
}
伪类
class EmployeeDao{
public List<Employee> returnList;
public getFilteredResponse(EmployeeFilterRequest request){
DataStore ds = getTheDatastore();
Query<Employee> query = ds.createQuery(Emploee.class).disableValidation();
//conditional request #1
if(request.filterBySalary){
query.filter("salary >", request.salary);
}
//conditional request #2
if(request.filterBydeptCode){
query.filter("deptCode ==", request.deptCode);
}
//conditional request #3
if(request.filterByNationality){
query.filter("nationality ==", request.nationality);
}
returnList = query.batchSize(10).asList();
/******* **THIS IS RETURNING ME ALL THE RECORDS IN THE COLLECTION, EXPECTED ONLY 10** *****/
}
}
所以如上代码中所述..我想对多个字段执行条件过滤。即使 batchSize 为 10,我也会在集合中获得完整的记录。
如何解决???
问候
惩罚
布莱克是对的。您想要使用 limit()
而不是 batchSize()
。批量大小只影响每次访问服务器返回的文档数量。这在拉取大量非常大的文档时很有用,但它不会影响查询获取的文档总数。
附带说明一下,使用 asList()
时应小心,因为它会从查询返回的每个文档中创建对象,并可能耗尽 VM 的堆。使用 fetch()
可让您根据需要逐步补充文档。您实际上可能需要将它们全部作为一个列表,并且大小为 10 这可能没问题。这只是您在处理其他查询时要记住的事情。
环境:MongoDb3.2,Morphia 1.1.0
假设我有一个 Employees 集合,Employee 实体有几个字段。我需要做一些事情,比如应用多个过滤器 (条件) 和 return 每个请求一批 10 条记录。
伪代码如下。
@Entity("Employee")
Employee{
String firstname,
String lastName,
int salary,
int deptCode,
String nationality
}
并且在我的EmployeeFilterRequest
中我将请求参数携带到dao
EmployeeFilterRequest{
int salaryLessThen
int deptCode,
String nationality..
}
伪类
class EmployeeDao{
public List<Employee> returnList;
public getFilteredResponse(EmployeeFilterRequest request){
DataStore ds = getTheDatastore();
Query<Employee> query = ds.createQuery(Emploee.class).disableValidation();
//conditional request #1
if(request.filterBySalary){
query.filter("salary >", request.salary);
}
//conditional request #2
if(request.filterBydeptCode){
query.filter("deptCode ==", request.deptCode);
}
//conditional request #3
if(request.filterByNationality){
query.filter("nationality ==", request.nationality);
}
returnList = query.batchSize(10).asList();
/******* **THIS IS RETURNING ME ALL THE RECORDS IN THE COLLECTION, EXPECTED ONLY 10** *****/
}
}
所以如上代码中所述..我想对多个字段执行条件过滤。即使 batchSize 为 10,我也会在集合中获得完整的记录。
如何解决???
问候 惩罚
布莱克是对的。您想要使用 limit()
而不是 batchSize()
。批量大小只影响每次访问服务器返回的文档数量。这在拉取大量非常大的文档时很有用,但它不会影响查询获取的文档总数。
附带说明一下,使用 asList()
时应小心,因为它会从查询返回的每个文档中创建对象,并可能耗尽 VM 的堆。使用 fetch()
可让您根据需要逐步补充文档。您实际上可能需要将它们全部作为一个列表,并且大小为 10 这可能没问题。这只是您在处理其他查询时要记住的事情。