我试图简单地在我的字段之间进行比较,但它似乎不适用于spring数据:
query.addCriteria(Criteria.where("active").gt("limit"));
字符串活动和限制是我收集的2个字段,我想显示超过限制的所有字段。这个限制是每个项目不同,所以我不能做gt(200)例如...有办法做到这一点吗?
oipij1gg1#
你可以回退到你的java驱动程序并发出一个$where查询:
$where
DBObject obj = new BasicDBObject(); obj.put( "$where", "this.active > this.limit"); ...
DBObject obj = new BasicDBObject();
obj.put( "$where", "this.active > this.limit");
...
字符串无论如何,您必须发出where命令此外,请注意警告段落
hi3rlvi22#
正如你所看到的here,即使你使用的是原生shell,Mongo也不支持这种查询。我想这就是为什么它不是Spring Data API的一部分。(我在文档中找不到它,我自己也从来没有用过它),它会隐藏在一个看起来很简单的语句背后的计算复杂性,特别是对关系数据库的开发者。即使在Spring Data中有一些我不知道的自定义查询的变通方法,我也不推荐它,因为它不会给你给予你期望从RDBMS获得的相同性能。同样的,使用原生Java驱动程序也是如此,在对你的问题的另一个回答中提出了-它会工作,但可能会很慢。如果你想在你的用例中使用Mongo,你可能需要考虑一种不同的存储数据的方式--注意,它并不是为你在这里想要做的而定制的。我不知道你的应用程序的上下文,但是如果你可以选择的话,最好把比较的结果存储在一个布尔字段中。当然,如果你想使用很多这样的字段,那就没有多大意义了。查询,特别是如果您希望能够灵活地使用在设计模式时没有考虑的比较。
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);
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);
字符串
zzwlnbp84#
自Spring Mongo Data 4.2.0开始使用
query.addCriteria( AggregationExpressionCriteria.whereExpr( ComparisonOperators.valueOf("active").greaterThan("limit")));
query.addCriteria(
AggregationExpressionCriteria.whereExpr(
ComparisonOperators.valueOf("active").greaterThan("limit")));
4条答案
按热度按时间oipij1gg1#
你可以回退到你的java驱动程序并发出一个
$where
查询:字符串
无论如何,您必须发出where命令
此外,请注意警告段落
hi3rlvi22#
正如你所看到的here,即使你使用的是原生shell,Mongo也不支持这种查询。我想这就是为什么它不是Spring Data API的一部分。(我在文档中找不到它,我自己也从来没有用过它),它会隐藏在一个看起来很简单的语句背后的计算复杂性,特别是对关系数据库的开发者。
即使在Spring Data中有一些我不知道的自定义查询的变通方法,我也不推荐它,因为它不会给你给予你期望从RDBMS获得的相同性能。同样的,使用原生Java驱动程序也是如此,在对你的问题的另一个回答中提出了-它会工作,但可能会很慢。
如果你想在你的用例中使用Mongo,你可能需要考虑一种不同的存储数据的方式--注意,它并不是为你在这里想要做的而定制的。我不知道你的应用程序的上下文,但是如果你可以选择的话,最好把比较的结果存储在一个布尔字段中。当然,如果你想使用很多这样的字段,那就没有多大意义了。查询,特别是如果您希望能够灵活地使用在设计模式时没有考虑的比较。
3pvhb19x3#
可以简单得多
字符串
zzwlnbp84#
自Spring Mongo Data 4.2.0开始使用
字符串