MongoDB 使用 Spring 数据 MongoDB 的项目和组操作
MongoDB Project and Group operations with Spring Data MongoDB
我想使用 Spring 数据 MongoDB 来执行以下查询,但我卡在了 project
操作上,我需要一些帮助。
这是要翻译的查询:
db.getCollection("employee_salaries").aggregate([
{ $match: {
salaries: {
$elemMatch: {
"to_date": { $gte: "1985-01-01" } ,
"to_date": { $lte: "1986-01-01" }
}
}
}},
{ $project: {
salaries: {
$filter: {
input: "$salaries",
as: "salaries",
cond: {$and: [
{ $gte: ["$$salaries.to_date", "1985-01-01"]},
{ $lt: ["$$salaries.to_date", "1986-01-01"]}
]}
}
}
}},
{ $unwind: "$salaries"},
{ $group: {
_id: "$null",
"total_salary": { $sum: "$salaries.salary"}
}}
])
这是我的尝试:
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SimpleService {
private final MongoTemplate mongoTemplate;
public Document aggregation() {
MatchOperation matchOperation = match(Criteria.where("salaries").elemMatch(Criteria.where("to_date").gte("1985-01-01").lte("1986-01-01")));
ProjectionOperation projectionOperation = project("salaries");
// other operations
UnwindOperation unwindOperation = unwind("salaries");
Document rawResults = mongoTemplate.aggregate(newAggregation(
matchOperation,
// other operations...
), Salaries.class, String.class).getRawResults();
return totalSalaryInOneYear;
}
}
ProjectionOperation 和 GroupOperation 所需的 imports 代码如下。
import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import org.springframework.data.mongodb.core.aggregation.BooleanOperators.And;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Gte;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Lt;
ProjectionOperation projectionOperation = project().and(filter("salaries")
.as("salaries")
.by(And.and(Gte.valueOf("salaries.to_date").greaterThanEqualToValue("1985-01-01"),Lt.valueOf("salaries.to_date").lessThanValue("1986-01-01"))))
.as("salaries");
当您按 null 分组时,无需传递任何 ID。
GroupOperation groupOperation = group().sum("salaries.salary").as("total_salary");
如果上述方法不起作用,您需要将一些 non-existing 字段传递给 group() 方法。确保传递的参数不属于您的集合。
GroupOperation groupOperation = group("NotAField").sum("salaries.salary").as("total_salary");
任何进一步的问题,让我知道。
我想使用 Spring 数据 MongoDB 来执行以下查询,但我卡在了 project
操作上,我需要一些帮助。
这是要翻译的查询:
db.getCollection("employee_salaries").aggregate([
{ $match: {
salaries: {
$elemMatch: {
"to_date": { $gte: "1985-01-01" } ,
"to_date": { $lte: "1986-01-01" }
}
}
}},
{ $project: {
salaries: {
$filter: {
input: "$salaries",
as: "salaries",
cond: {$and: [
{ $gte: ["$$salaries.to_date", "1985-01-01"]},
{ $lt: ["$$salaries.to_date", "1986-01-01"]}
]}
}
}
}},
{ $unwind: "$salaries"},
{ $group: {
_id: "$null",
"total_salary": { $sum: "$salaries.salary"}
}}
])
这是我的尝试:
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SimpleService {
private final MongoTemplate mongoTemplate;
public Document aggregation() {
MatchOperation matchOperation = match(Criteria.where("salaries").elemMatch(Criteria.where("to_date").gte("1985-01-01").lte("1986-01-01")));
ProjectionOperation projectionOperation = project("salaries");
// other operations
UnwindOperation unwindOperation = unwind("salaries");
Document rawResults = mongoTemplate.aggregate(newAggregation(
matchOperation,
// other operations...
), Salaries.class, String.class).getRawResults();
return totalSalaryInOneYear;
}
}
ProjectionOperation 和 GroupOperation 所需的 imports 代码如下。
import static org.springframework.data.mongodb.core.aggregation.Aggregation.group;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import org.springframework.data.mongodb.core.aggregation.BooleanOperators.And;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Gte;
import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Lt;
ProjectionOperation projectionOperation = project().and(filter("salaries")
.as("salaries")
.by(And.and(Gte.valueOf("salaries.to_date").greaterThanEqualToValue("1985-01-01"),Lt.valueOf("salaries.to_date").lessThanValue("1986-01-01"))))
.as("salaries");
当您按 null 分组时,无需传递任何 ID。
GroupOperation groupOperation = group().sum("salaries.salary").as("total_salary");
如果上述方法不起作用,您需要将一些 non-existing 字段传递给 group() 方法。确保传递的参数不属于您的集合。
GroupOperation groupOperation = group("NotAField").sum("salaries.salary").as("total_salary");
任何进一步的问题,让我知道。