MongoDB Spring 字段间数据对比

问题描述 投票:0回答:4

我试图简单地在我的字段之间进行比较,但它似乎不适用于 spring 数据:

query.addCriteria(Criteria.where("active").gt("limit"));

Active 和 limit 是我的集合的 2 个字段,我想显示超出限制的所有字段。每个项目的这个限制都是不同的,所以我不能做 gt(200) 例如......

有办法做到这一点吗?

java spring mongodb criteria spring-data-mongodb
4个回答
3
投票

您可以退回到 Java 驱动程序并发出

$where
查询:

 DBObject obj = new BasicDBObject();
 obj.put( "$where", "this.active > this.limit");
 ...

无论如何,你都必须发出 where 命令

另外,请考虑警告段落


1
投票

正如您在here所看到的,即使您使用本机 shell,Mongo 也不以有效的方式支持这种查询。我认为这就是为什么它不是 Spring Data API 的一部分(我在文档中的任何地方都找不到它,而且我自己也从未使用过它),它将隐藏看似非常简单的语句背后的计算复杂性,特别是对于习惯关系数据库的开发人员。

即使 Spring Data 中有某种我不知道的自定义查询解决方法,我也不会推荐它,因为它不会为您提供与 RDBMS 期望的相同性能。正如您问题的另一个答案中所建议的那样,使用本机 Java 驱动程序也是如此 - 它可以工作,但可能会很慢。

如果您想在您的用例中使用 Mongo,您可能需要考虑使用不同的方式来存储数据 - 请注意,它并不是为您在此处执行的操作而定制的。我不知道您的应用程序的上下文,但如果这是您的选择,最好将此比较的结果存储在布尔字段中。当然,如果您想使用其中许多查询,特别是如果您想灵活地使用设计模式时未考虑的比较,那么这没有多大意义。


1
投票

可以做得更简单

     class MyResult{
            long limit;
            long active;
            long  diff;

           //... getters and setters
     }
        Aggregation agg = Aggregation.newAggregation(
                Aggregation.project("active", "limit").andExpression("active - limit").as("diff"),
                Aggregation.match(Criteria.where("diff").gt(0)),
                Aggregation.project("active", "limit","diff")
        );

        AggregationResults<MyResult> results = mongoOperations.aggregate(agg, "yourCollection", MyResult.class);

0
投票

自 Spring Mongo Data 4.2.0 使用以来

query.addCriteria(
  AggregationExpressionCriteria.whereExpr(
    ComparisonOperators.valueOf("active").greaterThan("limit")));
© www.soinside.com 2019 - 2024. All rights reserved.