MongoDB Spring之间的数据比较

时间:2013-12-27 11:40:26

标签: java spring mongodb criteria spring-data-mongodb

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

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

活动和限制是我的收藏的2个字段,我用魔杖显示超出限制的所有字段。每个项目的限制是不同的,所以我不能做gt(200)例如......

无论如何要做到这一点?

3 个答案:

答案 0 :(得分:3)

您可以回退到Java驱动程序并发出$where查询:

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

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

另外,请考虑警告段落

答案 1 :(得分:1)

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

即使在Spring Data中我不了解自定义查询的某种解决方法,我也不推荐它,因为它不会给你提供与RDBMS相同的性能。在你的问题的另一个答案中提出的使用本机Java驱动程序也是如此 - 它会起作用,但可能会很慢。

如果您想将Mongo用于您的用例,您可能需要考虑一种不同的存储数据的方式 - 请注意,它不适合在此处执行您想要的操作。我不知道你的应用程序的上下文,但如果这是你的一个选项,最好将这个比较的结果存储在一个布尔字段中。当然,如果您想要使用其中的许多查询,那将毫无意义,特别是如果您希望能够灵活地使用在设计模式时未考虑的比较。

答案 2 :(得分:0)

可以做得更简单

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