Spring-boot Json MongoDb 查询中的可选 ArrayList 参数

Spring-boot Optional ArrayList parameter in Json MongoDb Query

查看其他关于如何使用 mongodb 和参数输入作为列表进行可选参数查询的帖子,我发现它可以通过这样的方式完成:

@Query("{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }")
List<Something> findAll(String query, Pageable pageable);

我的查询如下所示:

@Query("{ $or : [ { $where: '?3 == null' } ,{ input1 : { $in : ?3 } }], 'input2' : ?4 , 'input3' : ?2 ,'dateInput' : {$gt : ?0, $lte : ?1}}")
List<Entities> findThingsbyInputs(Long initialDate, Long endDate, Integer Input2, List<Integer> input1, Integer input3);

当我使用此查询和 Input1 = ?0 = ArrayList 时,如果列表不为空,它会很好地工作,但是当 ?0 为空时,将启动异常。我可以使用列表查询多个输入参数,但是当为 null 时,它不起作用。

错误信息是: 查询失败,错误代码 2 和服务器 localhost:27017

上的错误消息“$in 需要一个数组”

有什么帮助吗?提前致谢

我遇到了同样的问题,最终扩展了存储库并手动实现了复杂的方法。
调试后,我认为问题是由于 List<Integer> input1null 时,第一个或条件 { $where: '?3 == null' } 通过,但随后执行第二个 { input1 : { $in : ?3 } } 并结束看起来像: { input1 : { $in : NULL } } 导致面临的问题。

我的解决方案是扩展存储库、实施该方法并手动构建所需的查询。在你的情况下,它可能是这样的:

  @Autowired
  MongoTemplate mongoTemplate;

  List<Entities> findThingsbyInputs(Long initialDate, Long endDate, Integer input2,
                                    List<Integer> input1, Integer input3) {
    Query query = new Query();
    if(initialDate != null) {
      query.addCriteria(where("input1").is(input1));
    }

    query.addCriteria(where("input2").is(input2));
    query.addCriteria(where("input3").is(input3));
    query.addCriteria(new Criteria().andOperator(where("dateInput").gt(initialDate),
        where("dateInput").lt(endDate)));

    return mongoTemplate.find(query, Entities.class);

  }  

一个Jira ticket is still not resolved by Spring Team.