2017-08-01 147 views
2

我一直在尝试使用Aggregation Object将mongodb中的查询转换成Spring Data MongoDb时遇到问题。我在蒙戈下列文件:无法将聚合查询从MongoDB转换为Spring数据MongoDb

{ 
"_id" : ObjectId("596ce468798b61179c6442bb"), 
"_class" : "com.test.model.User", 
"name" : "Oi", 
"surName" : "Alo", 
"workLogs" : [ 
    { 
     "_id" : ObjectId("596ce468798b61179c6442bc"), 
     "day" : 1, 
     "month" : 1, 
     "year" : 2017, 
     "timeEntrance" : "8:00", 
     "lunchLeave" : "12:00", 
     "lunchBack" : "13:00", 
     "timeLeave" : "18:00" 
    }, 
    { 
     "_id" : ObjectId("596ce468798b61179c6442bd"), 
     "day" : 2, 
     "month" : 1, 
     "year" : 2017, 
     "timeEntrance" : "8:00", 
     "lunchLeave" : "12:00", 
     "lunchBack" : "13:00", 
     "timeLeave" : "18:00" 
    } 
    ] 
} 

我想查询哪些是在同一年份和月份所有workLogs,之后,我想只得到workLogs作为结果的数组。我设法使用此查询蒙戈做到这一点:

db.user.aggregate([ 
    {$unwind: '$workLogs'}, 
    {$match: {'workLogs.month':2, 'workLogs.year':2017}}, 
    {$group: {_id:'$_id', workLogs:{$push: '$workLogs'}}}, 
    {$project: {'_id':0, 'workLogs': 1}} 
]).pretty() 

但我找不到怎么来的,我觉得我几乎没有,如果有人可以帮助我,我将不胜感激翻译此查询到春季数据的MongoDB 。这是我在java中使用的代码。

Aggregation agg = Aggregation.newAggregation(
    unwind("workLogs"), 
    match(Criteria 
    .where("_id").is(userId) 
    .and("workLogs.month").is(1) 
    .and("workLogs.year").is(2017) 
    ), 
    group("_id"), 
    group("horarios") 
     .push(new BasicDBObject("workLogs", "workLogs")).as("workLogs"), 
    project("workLogs") 
); 

AggregationResults<WorkLog> results = mongoTemplate.aggregate(agg, "workLogs", WorkLog.class); 

谢谢大家提前!

回答

2

不确定为什么你的java代码中有所有额外的字段。

壳查询相当于Java中的代码是

Aggregation agg = Aggregation.newAggregation(
    unwind("workLogs"), 
    match(Criteria 
     .where("workLogs.month").is(1) 
     .and("workLogs.year").is(2017) 
    ), 
    group("_id").push("workLogs").as("workLogs"), 
    project("workLogs").andExclude("_id") 
); 

或者,您可以简化您的代码以使用$filter

import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation; 
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project; 
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter; 
import static org.springframework.data.mongodb.core.aggregation.BooleanOperators.And.and; 
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq; 

Aggregation agg = newAggregation(project(). 
    and(
     filter("workLogs"). 
     as("workLog"). 
     by(
     and(
      Eq.valueOf("workLog.month").equalToValue(1), 
      Eq.valueOf("workLog.year").equalToValue(2017) 
    ) 
    ) 
    ).as("workLogs"). 
    andExclude("_id") 
); 
+0

非常感谢!第一种方法(使用标准匹配)像魅力一样工作。第二种方法无效(使用过滤器),发生以下异常:InvalidDataAccessApiUsageException:命令执行失败:错误[异常:无效运算符'$ filter']。 无论如何,我会接受正确的,因为它解决了我的问题:) – Evandro

+0

不客气。从$ mongo 3.2版本开始提供'$ filter'操作符。 – Veeram