如何在 spring 中的 mongodb 中的多个条件上使用 for 循环
How to use the for loop over multiple criteria in mongodb from spring
我正在尝试对 spring Dao 中的条件使用 for 循环以 return 列表中匹配的每个场景的文档列表:
- mongoDb 包含多个时间相同的 studentId 的文档。
- 我有一个包含学生 ID 和时间的数组列表,我想在 mongodb
上查询
输入看起来像这样
List <StudentAssociation> ={{studentId:st1234,assocstarttime=2019-08-16,assocendtime:2019-08-17},{studentId:st3456,assocstarttime=2019-07-09, assocendtime=2019-08-15}}
我为没有 for 循环的单个学生编写的查询,但我想将列表作为输入发送
工作查询[=43=]
public List<Student> getListOfStudentRecords(String studentId, LocalDateTime assocstarttime, LocalDatetime assocendtime) {
Query query = new Query();
Criteria studentIdCriteria = Criteria
.where("studentId)
.is(studentId);
Criteria dateTimeCriteria = Criteria
.where(datetime)
.gte(assocstarttime.toString())
.lte(assocendtime.toString());
query.addCriteria(studentIdCriteria);
query.addCriteria(dateTimeCriteria);
return mongoTemplate.find(query, Student.class);
}
我正在尝试输入列表,以下查询
public 列出 getListofStudentRecordsUsingList(列出 studentAssoc){
Query query = new Query();
//for loop
for(StudentAssociation sa : studentAssoc) {
Criteria studentIdCriteria = Criteria
.where("studentId)
.is(studentId);
Criteria dateTimeCriteria = Criteria
.where(datetime)
.gte(sa.getAssocStarttime())
.lte(sa.getAssocEndtime());
query.addCriteria(studentIdCriteria);
query.addCriteria(dateTimeCriteria);
}
query.with(new Sort(Sort.Direction.ASC, datetime));
return mongoTemplate.find(query, Student.class);
}
预期输出是针对 return 文档列表中的每个学生,然后将每个学生的结果合并到一个列表中,并根据时间字段排序以创建时间线
我在第二次查询时遇到的错误是
//这在我移动查询时解决了 query = new Query();在 for 循环内
InvalidMongoDbApiUsageException:由于 com.mongodb.BasicDocument 的限制,您无法添加第二个 'studentId' 条件。 Query already contains '{ "lStudentId" : "st1234" }' //当我将查询移入 for 循环
时,此问题已解决
您的查询对象定义在循环之外,因此同一个对象用于整个循环。在第二遍中,查询变量已经包含 'studentId' 条件,如您的错误中所述。
尝试在循环内设置查询,或在循环开始时清除对象。
//for loop
for(StudentAssociation sa : studentAssoc) {
Query query = new Query();
...
循环查询是一件非常昂贵的事情,我建议您使用 and
& in
来减少查询次数。
Mongodb 提供像这样的运算符:
The $and operator evaluates one or more expressions and returns true if all of the expressions are true or if evoked with no argument expressions. Otherwise, $and returns false.
The $in operator selects the documents where the value of a field equals any value in the specified array.
Query findStudent = new Query(Criteria.where("studentId").in('List of id')
.and('datetime').gte('you should filter min time')
.lte('max time'))
.with(new Sort(Sort.Direction.ASC, datetime));
我正在尝试对 spring Dao 中的条件使用 for 循环以 return 列表中匹配的每个场景的文档列表:
- mongoDb 包含多个时间相同的 studentId 的文档。
- 我有一个包含学生 ID 和时间的数组列表,我想在 mongodb 上查询
输入看起来像这样
List <StudentAssociation> ={{studentId:st1234,assocstarttime=2019-08-16,assocendtime:2019-08-17},{studentId:st3456,assocstarttime=2019-07-09, assocendtime=2019-08-15}}
我为没有 for 循环的单个学生编写的查询,但我想将列表作为输入发送
工作查询[=43=]
public List<Student> getListOfStudentRecords(String studentId, LocalDateTime assocstarttime, LocalDatetime assocendtime) {
Query query = new Query();
Criteria studentIdCriteria = Criteria
.where("studentId)
.is(studentId);
Criteria dateTimeCriteria = Criteria
.where(datetime)
.gte(assocstarttime.toString())
.lte(assocendtime.toString());
query.addCriteria(studentIdCriteria);
query.addCriteria(dateTimeCriteria);
return mongoTemplate.find(query, Student.class);
}
我正在尝试输入列表,以下查询
public 列出 getListofStudentRecordsUsingList(列出 studentAssoc){
Query query = new Query();
//for loop
for(StudentAssociation sa : studentAssoc) {
Criteria studentIdCriteria = Criteria
.where("studentId)
.is(studentId);
Criteria dateTimeCriteria = Criteria
.where(datetime)
.gte(sa.getAssocStarttime())
.lte(sa.getAssocEndtime());
query.addCriteria(studentIdCriteria);
query.addCriteria(dateTimeCriteria);
}
query.with(new Sort(Sort.Direction.ASC, datetime));
return mongoTemplate.find(query, Student.class);
}
预期输出是针对 return 文档列表中的每个学生,然后将每个学生的结果合并到一个列表中,并根据时间字段排序以创建时间线
我在第二次查询时遇到的错误是 //这在我移动查询时解决了 query = new Query();在 for 循环内
InvalidMongoDbApiUsageException:由于 com.mongodb.BasicDocument 的限制,您无法添加第二个 'studentId' 条件。 Query already contains '{ "lStudentId" : "st1234" }' //当我将查询移入 for 循环
时,此问题已解决您的查询对象定义在循环之外,因此同一个对象用于整个循环。在第二遍中,查询变量已经包含 'studentId' 条件,如您的错误中所述。 尝试在循环内设置查询,或在循环开始时清除对象。
//for loop
for(StudentAssociation sa : studentAssoc) {
Query query = new Query();
...
循环查询是一件非常昂贵的事情,我建议您使用 and
& in
来减少查询次数。
Mongodb 提供像这样的运算符:
The $and operator evaluates one or more expressions and returns true if all of the expressions are true or if evoked with no argument expressions. Otherwise, $and returns false.
The $in operator selects the documents where the value of a field equals any value in the specified array.
Query findStudent = new Query(Criteria.where("studentId").in('List of id')
.and('datetime').gte('you should filter min time')
.lte('max time'))
.with(new Sort(Sort.Direction.ASC, datetime));