gpt4 book ai didi

java - 无法将聚合查询从 mongodb 转换为 Spring Data MongoDb

转载 作者:可可西里 更新时间:2023-11-01 10:02:29 25 4
gpt4 key购买 nike

我在尝试使用聚合对象将我在 mongodb 中的查询转换为 Spring Data MongoDb 时遇到了问题。我在 mongo 中有以下文档:

{
"_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"
}
]
}

我想查询同一年同月的所有工作日志,然后我只想获取工作日志数组作为结果。我使用这个查询设法用 mongo 做到了:

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

但我找不到如何将此查询转换为 Spring Data 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 代码中有所有额外的字段。

shell查询的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")
);

关于java - 无法将聚合查询从 mongodb 转换为 Spring Data MongoDb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45438858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com