我试图简单地在我的字段之间进行比较,但它似乎不适用于 spring 数据:
query.addCriteria(Criteria.where("active").gt("limit"));
Active 和 limit 是我的集合的 2 个字段,我想显示超出限制的所有字段。每个项目的这个限制都是不同的,所以我不能做 gt(200) 例如......
有办法做到这一点吗?
您可以退回到 Java 驱动程序并发出
$where
查询:
DBObject obj = new BasicDBObject();
obj.put( "$where", "this.active > this.limit");
...
无论如何,你都必须发出 where 命令
另外,请考虑警告段落
正如您在here所看到的,即使您使用本机 shell,Mongo 也不以有效的方式支持这种查询。我认为这就是为什么它不是 Spring Data API 的一部分(我在文档中的任何地方都找不到它,而且我自己也从未使用过它),它将隐藏看似非常简单的语句背后的计算复杂性,特别是对于习惯关系数据库的开发人员。
即使 Spring Data 中有某种我不知道的自定义查询解决方法,我也不会推荐它,因为它不会为您提供与 RDBMS 期望的相同性能。正如您问题的另一个答案中所建议的那样,使用本机 Java 驱动程序也是如此 - 它可以工作,但可能会很慢。
如果您想在您的用例中使用 Mongo,您可能需要考虑使用不同的方式来存储数据 - 请注意,它并不是为您在此处执行的操作而定制的。我不知道您的应用程序的上下文,但如果这是您的选择,最好将此比较的结果存储在布尔字段中。当然,如果您想使用其中许多查询,特别是如果您想灵活地使用设计模式时未考虑的比较,那么这没有多大意义。
可以做得更简单
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);
自 Spring Mongo Data 4.2.0 使用以来
query.addCriteria(
AggregationExpressionCriteria.whereExpr(
ComparisonOperators.valueOf("active").greaterThan("limit")));