我正在将Spring和MongoDB与MongoTemplate结合使用。
我有这份文件:
{
price: 50.0,
goal: {
currentValue: 20,
goal: 100
}
}
我需要执行一个查询,例如“ 为我提供其当前值与目标相同的值”或“ 给我提供其当前值为50%的文档”目标”。
是否可以这样做?到目前为止,我一直在进行这种查询,但从未进行过有条件的查询,该查询使用文档的当前值作为条件的一部分。
Criteria criteria = Criteria.where("price").exists(true);
GroupOperation totalAggregation = group()
.sum("goal.currentValue")
.as("currentValue")
.sum("goal.goal")
.as("goal");
UnwindOperation unwind = unwind("$goal");
Aggregation aggregation = newAggregation(match(criteria), unwind, totalAggregation);
AggregationResults<Document> results = mongoTemplate
.aggregate(aggregation,"Goals", Document.class);
现在,我只想将它们带入我上面所述的场景中。该怎么做?
谢谢。
答案 0 :(得分:1)
由于可以使用MongoDB 4.0.1,因此可以使用$expr
获得所需的结果。
所需查询如下:
db.criteria.find( { $expr: { $eq: [ "$goal.currentValue" , "$goal.goal" ] } } )
或者,如果您需要当前值作为目标的50%
db.criteria.find( { $expr: { $eq: [ "$goal.currentValue" , {divide : ["$goal.goal",2]} ] } } )
我不知道Spring,以及Spring如何使用mongodb,这就是为什么我在Mongo Shell中给出了答案。您可以在Spring MongoTemplate中编写语法。这个想法是使用$expr
在匹配条件下使用文档字段。
有关更多信息,请阅读MongoDB official $expr documentation。
更新:
相同的MongoTemplate语法可能看起来像这样(未经测试):
BasicQuery query1 = new BasicQuery("{ $expr: { $eq: [ '$goal.currentValue' , '$goal.goal' ] } }");
List<Document> = mongoOperation.find(query1, Document.class);
尝试一下,并告诉我上述查询中是否有错误。我只是尝试用您所需的语法编写它。
答案 1 :(得分:1)
我试图解决以下查询:“将当前值与目标相同的值带给我”或“将当前值等于其目标50%的文件带给我”。
这可以使用$ where运算符完成,您可以在其中传递JavaScript表达式或指定要评估条件的简单JavaScript函数。
https://docs.mongodb.com/manual/reference/operator/query/where/
这是我运行并给出预期结果的示例查询:
db.getCollection("stackQues").find(
{
$or: [
{$where: "this.goal.currentValue == this.goal.goal"},
{$where: "this.goal.currentValue == this.goal.goal/2"}
]
}
);