我正在尝试简单地对我的字段进行比较,但它似乎不适用于spring数据:
query.addCriteria(Criteria.where("active").gt("limit"));
活动和限制是我的收藏的2个字段,我用魔杖显示超出限制的所有字段。每个项目的限制是不同的,所以我不能做gt(200)例如......
无论如何要做到这一点?
答案 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);