MongoDB Spring字段之间的数据比较

vxf3dgd4  于 5个月前  发布在  Spring
关注(0)|答案(4)|浏览(71)

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

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

字符串
活动和限制是我收集的2个字段,我想显示超过限制的所有字段。这个限制是每个项目不同,所以我不能做gt(200)例如...
有办法做到这一点吗?

oipij1gg

oipij1gg1#

你可以回退到你的java驱动程序并发出一个$where查询:

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

字符串
无论如何,您必须发出where命令
此外,请注意警告段落

hi3rlvi2

hi3rlvi22#

正如你所看到的here,即使你使用的是原生shell,Mongo也不支持这种查询。我想这就是为什么它不是Spring Data API的一部分。(我在文档中找不到它,我自己也从来没有用过它),它会隐藏在一个看起来很简单的语句背后的计算复杂性,特别是对关系数据库的开发者。
即使在Spring Data中有一些我不知道的自定义查询的变通方法,我也不推荐它,因为它不会给你给予你期望从RDBMS获得的相同性能。同样的,使用原生Java驱动程序也是如此,在对你的问题的另一个回答中提出了-它会工作,但可能会很慢。
如果你想在你的用例中使用Mongo,你可能需要考虑一种不同的存储数据的方式--注意,它并不是为你在这里想要做的而定制的。我不知道你的应用程序的上下文,但是如果你可以选择的话,最好把比较的结果存储在一个布尔字段中。当然,如果你想使用很多这样的字段,那就没有多大意义了。查询,特别是如果您希望能够灵活地使用在设计模式时没有考虑的比较。

3pvhb19x

3pvhb19x3#

可以简单得多

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

字符串

zzwlnbp8

zzwlnbp84#

自Spring Mongo Data 4.2.0开始使用

query.addCriteria(
  AggregationExpressionCriteria.whereExpr(
    ComparisonOperators.valueOf("active").greaterThan("limit")));

字符串

相关问题