如何在 spring 中的 mongodb 中的多个条件上使用 for 循环

How to use the for loop over multiple criteria in mongodb from spring

我正在尝试对 spring Dao 中的条件使用 for 循环以 return 列表中匹配的每个场景的文档列表:

  1. mongoDb 包含多个时间相同的 studentId 的文档。
  2. 我有一个包含学生 ID 和时间的数组列表,我想在 mongodb
  3. 上查询

输入看起来像这样

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