无法将聚合查询从MongoDB转换为Spring数据MongoDb
问题描述:
我一直在尝试使用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);
谢谢大家提前!
答
不确定为什么你的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")
);
非常感谢!第一种方法(使用标准匹配)像魅力一样工作。第二种方法无效(使用过滤器),发生以下异常:InvalidDataAccessApiUsageException:命令执行失败:错误[异常:无效运算符'$ filter']。 无论如何,我会接受正确的,因为它解决了我的问题:) – Evandro
不客气。从$ mongo 3.2版本开始提供'$ filter'操作符。 – Veeram